如何在循环中创建一个对象字面量数组?

251
我需要创建一个对象字面量数组,类似于这样:
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);
}

数组每个元素中key的值应为results[i].label

9个回答

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

3
只计算一次长度可能是个好主意,我选择添加了一个 var obj 以使代码更清晰,当然你可以跳过它,如果你愿意的话,你也可以将整个脚本写在一行中 :) 建议翻译:建议只计算一次长度,我选择添加了一个 var obj 变量以使代码更加清晰。当然,如果你愿意,你可以跳过这一步,甚至可以将整个脚本写在一行里 :) - RaYell
8
@Triptych - 是的,但每次迭代执行的是属性查找,这是不免费的,可以避免。微小优化?可能是。此外,这是一个“实时”值——如果您在循环中修改数组,则长度将在后续迭代中更改,这可能会导致无限循环。观看这个视频:http://www.youtube.com/watch?v=mHtdZgou0qU - Peter Bailey
2
是的,但你每个迭代并没有修改数组。如果你这样做了,大多数情况下比较长度就没什么意义了。 - Kenan Banks
为什么arr变成了一个对象?JS是否可以有对象数组,而不是像对象一样的数组?https://jsfiddle.net/91cgc4zu/ - fdrv
我喜欢在循环外获取长度的模式。即使在这里可能并不重要,但对于那些需要注意的情况(以及其他编程语言),这是一个好习惯。 - JR Lawhorne
@fdrv 不确定您是否仍需要回复,但是arr何时“变成”对象?它一开始就是一个对象。JS数组可以包含任何值。 - Sebastian Simon

62

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
你好像在设置变量key后漏掉了一个分号? - superUntitled
很好的答案,我已经寻找如何访问这些信息有一段时间了,谢谢。 - thatOneGuy
如果键需要出现不止一次怎么办! ['notes'] 可以出现多次,那我们该怎么办? - Milson
2
Milson - 在这种情况下,它并不是真正的“关键”。 - Kenan Banks

39

在ES6中,你可以这样做。

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

22

这就是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)));
}

4

如果你想在ES6中比@tetra更进一步,你可以使用对象展开语法,像这样做:

const john = { firstName: "John", lastName: "Doe" };
const people = new Array(10).fill().map((e, id) => ({ ...john, id }));

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

3
var myColumnDefs = new Array();

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

7
[]初始化数组比用new Array()更好。 - RaYell
有趣的讨论[] vs. new Array() https://dev59.com/uWs05IYBdhLWcg3wNPS7 - Adrian P.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接