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

cod*_*boy 216 javascript arrays object-literal

我需要创建一个对象文字数组,如下所示:

var myColumnDefs = [
    {key:"label", sortable:true, resizeable:true},
    {key:"notes", sortable:true,resizeable:true},......
Run Code Online (Sandbox Code Playgroud)

在这样的循环中:

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

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

RaY*_*ell 380

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
    });
}
Run Code Online (Sandbox Code Playgroud)

  • 你可以跳过`var obj = {`位,只需按下文字本身. (18认同)
  • @Triptych - 是的,但它是一个属性查找,你执行每次迭代,这是不自由的,可以避免.微优化?有可能.此外,它是一个"实时"值 - 如果您在循环中修改数组,长度将在连续迭代时改变,这可能导致无穷大.给这个手表http://www.youtube.com/watch?v=mHtdZgou0qU (8认同)
  • 计算长度只有一次可能是一个好主意,我选择添加`var obj`以使代码更清晰,当然你可以跳过它,如果你愿意,你可以把整个脚本写成一行:) (3认同)
  • @kangax,长度不是"计算"的,它是一个O(1)操作. (3认同)
  • 是的,但是你不是每次迭代都要修改数组.如果你是的话,在大多数情况下,无论如何都要与长度进行比较是荒谬的. (2认同)

Tri*_*ych 60

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;
Run Code Online (Sandbox Code Playgroud)

上述方法应该比在整个对象数组中搜索每个访问的密钥快得多并且惯用.

  • 米尔森 - 在这种情况下,它并不是真正的“钥匙” (2认同)

End*_*ess 11

这就是Array#map擅长的

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


tet*_*ter 6

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

new Array(10).fill().map((e,i) => {
   return {idx: i}
});
Run Code Online (Sandbox Code Playgroud)


JPI*_*Iyo 5

在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)));
}
Run Code Online (Sandbox Code Playgroud)