声明对象数组


87

我有一个变量,它是一个数组,并且我希望该数组的每个元素默认都充当对象。为此,我可以在代码中执行类似的操作。

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

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

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

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


1
那么,您是否要默认使所有数组项成为对象?
杰夫·谢弗2013年

@Jeff Yupp,你是对的..
Prasathķ

我认为这样做没有意义。也许了解您为什么要这样做是可以帮助我们了解如何真正解决您的问题。
Jeff Shaver

1
对象中有什么?听起来好像array.push(objYouWant )在函数内部实现绝对是解决方案,这样每次运行函数时,它将添加一个具有所需属性的新对象。
杰夫·谢弗2013年

1
我不认为让它们自动成为对象会对您的情况有所帮助。
杰夫·谢弗2013年

Answers:


89

使用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({});

38

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

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

@PrasathK,您是说要动态填充数组(例如通过循环)吗?然后,您应该听从Daniel的回答并使用push()
弗雷德里克哈米迪

@PrasathK,那票不是我的。如果我对您的理解正确,那么在您的问题下杰夫·谢弗(Jeff Shaver)的评论是对的吗?
弗雷德里克哈米迪

23

您可以使用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()可以根据需要填充每个单独的点。


发布后,我刚好在首页上看到它。之所以引起我的注意,是因为这是一个带有新答案的老问题。
melpomene '16

与其他答案相比,我认为这是很难使用和理解的。
萨钦沙(Shachin Shah),

12

在看到您如何评论后。似乎最好push按照其他人的建议使用。这样,您无需知道索引,但仍可以将其添加到数组中。

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

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


哦天哪..我在那些对象中有100多个变量,对于函数的每个对象或调用,我必须在函数开始时为某些变量初始化一些值
Prasath K 2013年

11

您实际上根本不需要创建blank Object。你不能对他们做任何事。只需根据需要将工作对象添加到样本中即可。使用push丹尼尔IMMS建议,并使用文字作为弗雷德里克·哈米迪建议。您似乎想像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元素的数组。


10

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

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

2
如果我不知道元素的值怎么办?
2015年

6

好吧array.length,该怎么做?就像,我的意思是,只要阅读它就不需要知道索引范围。

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

也许我不能正确理解您的问题,但是您应该能够以这种方式获取Array的长度并将其转换为对象。丹尼尔(Daniel)给出了相同的答案,说实话。您可以将您的array-length保存到他的变量中,即可完成。

如果我认为这不应该发生,那么您就无法获得数组长度。正如您所说的不获取索引号一样,您可以这样做:

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

这是上述版本的不错的版本,但是循环将执行直到您“超出”索引范围为止。



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

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


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

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

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


1

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

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

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

任何人都可以尝试这个。


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

1
不。那是一个对象的非空数组。
昆汀

欢迎使用Stack Overflow!尽管此代码段可以解决问题,但提供说明确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。也请尽量不要在代码中加入解释性注释,这会降低代码和解释的可读性!
kayess
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.