声明对象数组

时间:2013-04-01 11:19:04

标签: javascript arrays object declare

我有一个变量,它是一个数组,我希望默认情况下数组的每个元素都充当一个对象。要实现这一点,我可以在我的代码中执行类似的操作。

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

这很好用,但我不想提及任何索引号。我希望我的数组的所有元素都是一个对象。我如何声明或初始化它?

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

我尝试了上面的代码,但它不起作用。如何在不使用索引号的情况下初始化对象数组?

15 个答案:

答案 0 :(得分:79)

使用array.push()将项目添加到数组的末尾。

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

要执行此操作n次,请使用for循环。

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

请注意,您也可以将new Array()替换为[],将new Object()替换为{},以便它变为:

var n = 100;
var sample = [];
for (var i = 0; i < n; i++)
    sample.push({});

答案 1 :(得分:31)

根据声明的含义,您可以尝试在object literals中使用array literal

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

编辑:如果您的目标是默认情况下undefined项为空对象文字的数组,则可以编写一个小实用程序函数:

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

然后像这样使用它:

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

甚至:

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

当然,直接指定getDefaultObjectAt()的返回值是行不通的,所以你不能写:

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

答案 2 :(得分:11)

在看到您在评论中的回复后。似乎最好像其他人所建议的那样使用push。这样您就不需要知道索引,但仍然可以添加到数组中。

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

在这种情况下,每次使用该函数时,它都会将一个新对象推入数组。

答案 3 :(得分:10)

您实际上并不需要创建空白Object。你不能对它们做任何事情。只需根据需要将工作对象添加到样本中。像Daniel Imms建议的那样使用push,并使用FrédéricHamidi建议的文字。你似乎想要像C一样编写Javascript。

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. */

我相信使用new Array(10)会创建一个包含10个undefined元素的数组。

答案 4 :(得分:7)

您可以实例化一个&#34;对象类型的数组&#34;在这样的一行中(只需用您的对象替换 new Object()):

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

答案 5 :(得分:5)

那么array.length应该诀窍呢?类似的,我的意思是,如果你只是阅读它,你不需要知道索引范围..

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

也许我没有正确理解您的问题,但您应该能够以这种方式获取数组的长度并将它们转换为对象。老实说,丹尼尔给出了同样的答案。你可以将你的数组长度保存到他的变量中,然后就可以了。

如果在我看来这不应该发生你不能得到你的数组长度。如你所说没有获得索引号,你可以这样做:

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

这是上述版本的不太好的版本,但循环将执行,直到你“跑出”索引范围。

答案 6 :(得分:5)

您可以使用fill()然后map。这是自我解释的。

let arr = new Array(5).fill(null).map(v => new String('lol'));

将创建一个包含5个字符串对象的数组(不是字符串!)。然后你可以使用forEach作为例子。

arr.forEach(d => console.log(d.toString()));

在我看来,这个问题的答案毫无疑问是冗长的。所以我希望这对你们中的一些人有用。

答案 7 :(得分:3)

试试这个 -

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

答案 8 :(得分:3)

//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); 

此示例适用于我。 Snapshot for the Output on Browser Console

答案 9 :(得分:0)

使用array.push()将项添加到数组的末尾。

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

你可以使用它

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

答案 10 :(得分:0)

使用forEach,我们可以存储数据,以防我们已经拥有数据,我们想要对数据进行一些业务登录。

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);

使用简单的for循环

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

答案 11 :(得分:0)

如果希望数组中的所有元素都是对象,则可以在将对象插入数组之前使用JavaScript代理对它们进行验证。很简单,

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');
    }
  }
});

现在,如果您尝试执行以下操作:

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

它将引发错误。但是,如果您插入一个对象,将允许它:

arr[0] = {}; // Allowed

有关代理的更多详细信息,请参考以下链接: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

如果您正在寻找实现polyfill的方法,则可以查看以下链接: https://github.com/GoogleChrome/proxy-polyfill

答案 12 :(得分:0)

我项目中的以下代码可能对您有用

  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 });
}

答案 13 :(得分:0)

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;

任何人都可以尝试这个。.并提出一些建议。

答案 14 :(得分:-7)

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