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


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

の値は、配列の各要素にあるkey必要がありますresults[i].label

回答:


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
長さを1回だけ計算するのはおそらく良い考えvar objです。コードをより明確にするためにを追加することを選択します。もちろん、スキップすることもできます。必要に応じて、スクリプト全体を1行で記述できます:)
RaYell

3
@kangax、長さは「計算」されず、O(1)操作です。
トリプティク

8
@Triptych-はい。ただし、これは各反復で実行するプロパティルックアップであり、無料ではなく、回避できます。ミクロ最適化?たぶん。また、これは「ライブ」値です。ループで配列を変更すると、長さが連続する反復で変化し、無限につながる可能性があります。これを見てくださいyoutube.com/watch?v=mHtdZgou0qU
ピーターベイリー

2
ええ、でも、反復ごとに配列を変更するわけではありません。もしそうなら、ほとんどの場合、とにかく長さと比較するのはばかげています。
トリプティク

61

レイエルの答えは良いです-それはあなたの質問に答えます。

ただし、サブオブジェクトを値として持つラベルでキー設定されたオブジェクトを実際に作成する必要があるように見えます。

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

varキーを設定した後、セミコロンがないように見えますか?
superUntitled 2013年

いい答えです、しばらくの間情報にアクセスする方法を探していました。ありがとう
thatOneGuy

キーが複数回必要な場合はどうなりますか?['notes']は複数回発生する可能性があるため、何ができるでしょうか?
ミルソン

1
ミルソン-その場合、それは実際には「鍵」ではありません
トリプティク2015年

13

ES6ではそのようなことを行うことができます。

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


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});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.