105

I have a variable which is an array and I want every element of the array to act as an object by default. To achieve this, I can do something like this in my code.

var sample = new Array();
sample[0] = new Object();
sample[1] = new Object();

This works fine, but I don't want to mention any index number. I want all elements of my array to be an object. How do I declare or initialize it?

var sample = new Array();
sample[] = new Object();

I tried the above code but it doesn't work. How do I initialize an array of objects without using an index number?

5
  • 1
    So are you trying to make all array items objects, by default? Commented Apr 1, 2013 at 11:31
  • @Jeff Yupp , you are right.. Commented Apr 1, 2013 at 11:33
  • I don't see the point in doing so. Maybe understanding why you want to do it this way would help us understand how to actually solve your problem. Commented Apr 1, 2013 at 11:36
  • 1
    What is in the objects? It sounds like implementing array.push(objYouWant ) inside the function would definitely be the solution.That way each time the function is run, it adds a new object with whatever properties you want. Commented Apr 1, 2013 at 11:45
  • 1
    I don't see how having them automatically be objects would help your situation. Commented Apr 1, 2013 at 11:52

15 Answers 15

95

Use array.push() to add an item to the end of the array.

var sample = new Array();
sample.push(new Object());

To do this n times use a for loop.

var n = 100;
var sample = new Array();
for (var i = 0; i < n; i++)
    sample.push(new Object());

Note that you can also substitute new Array() with [] and new Object() with {} so it becomes:

var n = 100;
var sample = [];
for (var i = 0; i < n; i++)
    sample.push({});
Sign up to request clarification or add additional context in comments.

Comments

45

Depending on what you mean by declaring, you can try using object literals in an array literal:

var sample = [{}, {}, {} /*, ... */];

EDIT: If your goal is an array whose undefined items are empty object literals by default, you can write a small utility function:

function getDefaultObjectAt(array, index)
{
    return array[index] = array[index] || {};
}

Then use it like this:

var sample = [];
var obj = getDefaultObjectAt(sample, 0);     // {} returned and stored at index 0.

Or even:

getDefaultObjectAt(sample, 1).prop = "val";  // { prop: "val" } stored at index 1.

Of course, direct assignment to the return value of getDefaultObjectAt() will not work, so you cannot write:

getDefaultObjectAt(sample, 2) = { prop: "val" };

2 Comments

@PrasathK, do you mean you're populating your array dynamically (e.g. through a loop)? Then you should follow Daniel's answer and use push().
@PrasathK, that downvote is not mine. If I understand you correctly, Jeff Shaver's comment under your question is right?
38

You can use fill().

let arr = new Array(5).fill('lol');

let arr2 = new Array(5).fill({ test: 'a' });
// or if you want different objects
let arr3 = new Array(5).fill().map((_, i) => ({ id: i }));

Will create an array of 5 items. Then you can use forEach for example.

arr.forEach(str => console.log(str));

Note that when doing new Array(5) it's just an object with length 5 and the array is empty. When you use fill() you fill each individual spot with whatever you want.

3 Comments

I happened to see it on the front page right after you posted. It caught my eye because it was such an old question with a new answer.
I think this is a difficult to use and understand compared to other answers.
I was looking for the map syntax, or a newfangled improvement on it. Note that fill uses a static value so if you want unique objects you use the 3rd version with map. The 2nd version is unlikely to be useful.
13

After seeing how you responded in the comments. It seems like it would be best to use push as others have suggested. This way you don't need to know the indices, but you can still add to the array.

var arr = [];
function funcInJsFile() {
    // Do Stuff
    var obj = {x: 54, y: 10};
    arr.push(obj);
}

In this case, every time you use that function, it will push a new object into the array.

1 Comment

Oh god .. i have more than 100 variables in those objects and for each and every object or call of the function i have to initialize some values for some of the variables at the start of the function
11

You don't really need to create blank Objects ever. You can't do anything with them. Just add your working objects to the sample as needed. Use push as Daniel Imms suggested, and use literals as Frédéric Hamidi suggested. You seem to want to program Javascript like C.

var samples = []; /* If you have no data to put in yet. */
/* Later, probably in a callback method with computed data */
/* replacing the constants. */
samples.push(new Sample(1, 2, 3)); /* Assuming Sample is an object. */
/* or */
samples.push({id: 23, chemical: "NO2", ppm: 1.4}); /* Object literal. */

I believe using new Array(10) creates an array with 10 undefined elements.

Comments

10

You can instantiate an array of "object type" in one line like this (just replace new Object() with your object):

var elements = 1000;
var MyArray = Array.apply(null, Array(elements)).map(function () { return new Object(); });

1 Comment

What if i don't know the value of elements ?
6
//making array of book object
var books = [];
    var new_book = {id: "book1", name: "twilight", category: "Movies", price: 10};
    books.push(new_book);
    new_book = {id: "book2", name: "The_call", category: "Movies", price: 17};
    books.push(new_book);
    console.log(books[0].id);
    console.log(books[0].name);
    console.log(books[0].category);
    console.log(books[0].price);

// also we have array of albums
var albums = []    
    var new_album = {id: "album1", name: "Ahla w Ahla", category: "Music", price: 15};
    albums.push(new_album);
    new_album = {id: "album2", name: "El-leila", category: "Music", price: 29};
    albums.push(new_album);
//Now, content [0] contains all books & content[1] contains all albums
var content = [];
content.push(books);
content.push(albums);
var my_books = content[0];
var my_albums = content[1];
console.log(my_books[0].name);
console.log(my_books[1].name); 

console.log(my_albums[0].name);
console.log(my_albums[1].name); 

This Example Works with me. Snapshot for the Output on Browser Console

Comments

5

Try this-

var arr = [];
arr.push({});

2 Comments

This makes only one element to be an object.. I want all of my elements to be an object
@ShuklaSannidhya This post is lacking explanation of what this does and why you recommend it. ...just saying.
5

Well array.length should do the trick or not? something like, i mean you don't need to know the index range if you just read it..

var arrayContainingObjects = [];
for (var i = 0; i < arrayContainingYourItems.length; i++){
    arrayContainingObjects.push {(property: arrayContainingYourItems[i])};
}

Maybe i didn't understand your Question correctly, but you should be able to get the length of your Array this way and transforming them into objects. Daniel kind of gave the same answer to be honest. You could just save your array-length in to his variable and it would be done.

IF and this should not happen in my opinion you can't get your Array-length. As you said w/o getting the index number you could do it like this:

var arrayContainingObjects = [];
for (;;){
    try{
        arrayContainingObjects.push {(property: arrayContainingYourItems[i])};
    }
}
catch(err){
    break;
}

It is the not-nice version of the one above but the loop would execute until you "run" out of the index range.

Comments

2
const sample = [];
    list.forEach(element => {
      const item = {} as { name: string, description: string };
      item.name= element.name;
      item.description= element.description;
      sample.push(item);
    });
    return sample;

Anyone try this.. and suggest something.

1 Comment

correct me if I'm wrong... but JS does not support type assertion expression... so this solution would only work with TS
1

Use array.push() to add an item to the end of the array.

var sample = new Array();
sample.push(new Object());

you can use it

var x = 100;
var sample = [];
for(let i=0; i<x ;i++){
  sample.push({}) 
  OR
  sample.push(new Object())
}    

Comments

1

Using forEach we can store data in case we have already data we want to do some business login on data.

var sample = new Array();
var x = 10;
var sample = [1,2,3,4,5,6,7,8,9];
var data = [];

sample.forEach(function(item){
    data.push(item);
})

document.write(data);

Example by using simple for loop

var data = [];
for(var i = 0 ; i < 10 ; i++){
   data.push(i);
}
document.write(data);

Comments

1

If you want all elements inside an array to be objects, you can use of JavaScript Proxy to apply a validation on objects before you insert them in an array. It's quite simple,

const arr = new Proxy(new Array(), {
  set(target, key, value) {
    if ((value !== null && typeof value === 'object') || key === 'length') {
      return Reflect.set(...arguments);
    } else {
      throw new Error('Only objects are allowed');
    }
  }
});

Now if you try to do something like this:

arr[0] = 'Hello World'; // Error

It will throw an error. However if you insert an object, it will be allowed:

arr[0] = {}; // Allowed

For more details on Proxies please refer to this link: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

If you are looking for a polyfill implementation you can checkout this link: https://github.com/GoogleChrome/proxy-polyfill

Comments

0

The below code from my project maybe it good for you

  reCalculateDetailSummary(updateMode: boolean) {

    var summaryList: any = [];
    var list: any;
    if (updateMode) { list = this.state.pageParams.data.chargeDefinitionList }
    else {
        list = this.state.chargeDefinitionList;
    }

    list.forEach((item: any) => {
        if (summaryList == null || summaryList.length == 0) {
            var obj = {
                chargeClassification: item.classfication,
                totalChargeAmount: item.chargeAmount
            };
            summaryList.push(obj);

        } else {
            if (summaryList.find((x: any) => x.chargeClassification == item.classfication)) {
                summaryList.find((x: any) => x.chargeClassification == item.classfication)
                    .totalChargeAmount += item.chargeAmount;
            }
        }
    });

    if (summaryList != null && summaryList.length != 0) {
        summaryList.push({
            chargeClassification: 'Total',
            totalChargeAmount: summaryList.reduce((a: any, b: any) => a + b).totalChargeAmount
        })
    }

    this.setState({ detailSummaryList: summaryList });
}

Comments

-7
var ArrayofObjects = [{}]; //An empty array of objects.

2 Comments

No. That's a non-empty array of one object.
Welcome to Stack Overflow! While this code snippet may solve the question, including an explanation really helps to improve the quality of your post. Remember that you are answering the question for readers in the future, and those people might not know the reasons for your code suggestion. Please also try not to crowd your code with explanatory comments, this reduces the readability of both the code and the explanations!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.