web-dev-qa-db-ja.com

ループ内でオブジェクトリテラルの配列を作成する方法

このようなオブジェクトリテラルの配列を作成する必要があります。

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になります。

211
codecowboy
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
    });
}
369
RaYell

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;

上記の方法は、各アクセスのキーをオブジェクト配列全体から検索するよりもはるかに高速で慣用的なはずです。

59
Triptych

これが Array#map が得意なことです

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

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

これは動作します:

 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
Manjunath Raddi

配列を作成し、それにオブジェクトリテラルを追加します。

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
BenM

ES6でもそのようなことができます。

new Array(10).fill().map((e,i) => {
   return {idx: i}
});
2
tetra master
var myColumnDefs = new Array();

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

ES6で@tetraよりさらに進んでいきたい場合は、いわゆる "オブジェクトスプレッド構文"を使用して、次のようにすることができます。

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

let people = new Array(10).fill().map((e, i) => {

    return {
        ...john,
        id: i
    }
});
0
Pe Wu