如何在循环中创建对象文字数组?


224

我需要创建这样的对象文字数组:

var myColumnDefs = [
    {key:"label", sortable:true, resizeable:true},
    {key:"notes", sortable:true,resizeable:true},......

在这样的循环中:

for (var i = 0; i < oFullResponse.results.length; i++) {
    console.log(oFullResponse.results[i].label);
}

的值keyresults[i].label位于数组的每个元素中。

Answers:


395
var arr = [];
var len = oFullResponse.results.length;
for (var i = 0; i < len; i++) {
    arr.push({
        key: oFullResponse.results[i].label,
        sortable: true,
        resizeable: true
    });
}

18
您可以跳过这var obj = {一步,只需按原义本身即可。
彼得·贝利

3
仅计算一次长度可能是一个好主意,我选择添加一个var obj使代码更清晰,当然您可以跳过它,可以根据需要在一行中编写整个脚本:)
RaYell

3
@kangax,不是“计算长度”,而是O(1)操作。
三联画

8
@Triptych-是的,但这是您在每次迭代中执行的属性查找,它不是免费的,可以避免。微观优化?可能吧 另外,它是一个“实时”值-如果您在循环中修改数组,则长度将在连续迭代中更改,这可能导致无穷大。观看手表youtube.com/watch?v=mHtdZgou0qU
Peter Bailey 2009年

2
是的,但是您不必每次迭代都修改数组。如果是这样,无论如何在大多数情况下将长度与长度进行比较是荒谬的。
三联画

61

RaYell的回答很好-它回答了您的问题。

在我看来,虽然您确实应该创建一个由带有子对象作为值的标签作为键的对象:

var columns = {};
for (var i = 0; i < oFullResponse.results.length; i++) {
    var key = oFullResponse.results[i].label;
    columns[key] = {
        sortable: true,
        resizeable: true
    };
}

// Now you can access column info like this. 
columns['notes'].resizeable;

上面的方法应该比在整个对象数组中为每次访问搜索键都更快,更惯用。


自关键解决方案以来+1,这更有意义,可以帮助我满足我的需求:)
winner_joiner 2013年

设置var键后,似乎缺少分号了吗?
superUntitled 2013年

一个不错的答案,一段时间以来一直在寻找如何访问信息,谢谢
thatOneGuy 2015年

如果密钥需要不止一次该怎么办!['notes']可以出现不止一次,那么我们该怎么办?
米尔森

1
米尔森(Milson)-在那种情况下,它并不是真正的“钥匙”
Triptych

13

您可以在ES6中执行类似的操作。

new Array(10).fill().map((e,i) => {
   return {idx: i}
});

12

这就是Array#map擅长的

var arr = oFullResponse.results.map(obj => ({
    key: obj.label,
    sortable: true,
    resizeable: true
}))

4

这将起作用:

 var myColumnDefs = new Object();
 for (var i = 0; i < oFullResponse.results.length; i++) {
     myColumnDefs[i] = ({key:oFullResponse.results[i].label, sortable:true, resizeable:true});
  }

4

与Nick Riggs相同,但我创建了一个构造函数,并使用它在数组中推送了一个新对象。它避免了重复该类的键:

var arr = [];
var columnDefs = function(key, sortable, resizeable){
    this.key = key; 
    this.sortable = sortable; 
    this.resizeable = resizeable;
    };

for (var i = 0; i < len; i++) {
    arr.push((new columnDefs(oFullResponse.results[i].label,true,true)));
}

3

我将创建数组,然后将对象文字附加到该数组。

var myColumnDefs = [];

for ( var i=0 ; i < oFullResponse.results.length; i++) {

    console.log(oFullResponse.results[i].label);
    myColumnDefs[myColumnDefs.length] = {key:oFullResponse.results[i].label, sortable:true, resizeable:true};
}


2

如果要在ES6上走得比@tetra更进一步,可以使用对象传播语法并执行以下操作:

let john = {
    firstName: "John",
    lastName: "Doe",
};

let people = new Array(10).fill().map((e, i) => {(...john, id: i});
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.