93

我有一个变量,它是一个数组,我希望数组的每个元素默认都充当一个对象。为了实现这一点,我可以在我的代码中做这样的事情。

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

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

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

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

4

15 回答 15

92

用于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({});
于 2013-04-01T11:21:25.007 回答
43

根据声明的含义,您可以尝试在数组文字中使用对象文字

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" };
于 2013-04-01T11:21:17.210 回答
32

您可以使用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 }));

将创建一个包含 5 个项目的数组。然后你可以使用 forEach 例如。

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

请注意,这样做时new Array(5)它只是一个长度为 5 的对象,并且数组为空。当你使用时,你可以用fill()你想要的任何东西填充每个单独的位置。

于 2016-12-29T20:55:22.383 回答
12

在看到你在评论中的反应之后。似乎最好push按照其他人的建议使用。这样你就不需要知道索引,但你仍然可以添加到数组中。

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

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

于 2013-04-01T11:50:23.273 回答
11

你真的不需要创建空白Objects 。你不能对他们做任何事。只需根据需要将您的工作对象添加到示例中。push按照 Daniel Imms 的建议使用,并按照 Frédéric Hamidi 的建议使用文字。您似乎想像 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. */

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

于 2013-04-01T11:31:34.147 回答
10

您可以像这样在一行中实例化一个“对象类型”数组(只需将new Object()替换为您的对象):

var elements = 1000;
var MyArray = Array.apply(null, Array(elements)).map(function () { return new Object(); });
于 2015-05-30T10:55:37.443 回答
6

那么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;
}

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

于 2014-03-18T14:36:08.407 回答
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); 

这个例子适用于我。 浏览器控制台上的输出快照

于 2017-06-06T14:30:18.720 回答
5

尝试这个-

var arr = [];
arr.push({});
于 2013-04-01T11:23:18.363 回答
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;

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

于 2019-09-30T11:16:25.607 回答
1

如果您希望数组中的所有元素都是对象,您可以使用 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

于 2019-02-11T13:57:03.267 回答
1

使用 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);
于 2018-01-23T05:33:32.477 回答
1

使用 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())
}    
于 2017-12-21T04:59:58.417 回答
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 });
}
于 2019-08-08T09:16:02.710 回答
-7
var ArrayofObjects = [{}]; //An empty array of objects.
于 2016-12-08T07:20:05.507 回答