Bagaimana cara membuat array literal objek dalam satu lingkaran?


224

Saya perlu membuat array literal objek seperti ini:

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

Dalam satu lingkaran seperti ini:

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

Nilai keyharus results[i].labeldalam setiap elemen array.

Jawaban:


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
Anda dapat melewatkan var obj = {sedikit, cukup tekan literal itu sendiri.
Peter Bailey

3
menghitung panjang hanya sekali mungkin ide yang baik, saya memilih untuk menambahkan var objuntuk membuat kode lebih jelas, tentu saja Anda dapat melewati itu, Anda dapat menulis seluruh naskah dalam satu baris jika Anda ingin :)
RaYell

3
@ Kangax, Panjangnya tidak "dihitung", ini adalah operasi O (1).
Triptych

8
@ Triptych - Ya, tapi ini adalah pencarian properti yang Anda lakukan dengan setiap iterasi, yang tidak gratis dan dapat dihindari. Optimalisasi mikro? Mungkin. Juga, ini adalah nilai "hidup" - jika Anda memodifikasi array dalam loop, panjangnya akan berubah pada iterasi yang berurutan yang dapat menyebabkan tak hingga. Berikan ini arloji youtube.com/watch?v=mHtdZgou0qU
Peter Bailey

2
Ya, tetapi Anda tidak mengubah array setiap iterasi. Jika Anda melakukannya, itu akan menjadi konyol untuk membandingkan terhadap panjang pula dalam kebanyakan kasus.
Triptych

61

Jawaban RaYell baik - itu menjawab pertanyaan Anda.

Menurut saya, Anda seharusnya benar-benar membuat objek yang dikunci oleh label dengan sub-objek sebagai nilai:

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;

Pendekatan di atas harus jauh lebih cepat dan idiomatis daripada mencari seluruh array objek untuk kunci untuk setiap akses.


1 sejak solusi utama, lebih masuk akal dan membantu saya dengan kebutuhan saya :)
winner_joiner

sepertinya Anda kehilangan titik koma setelah Anda mengatur kunci var?
superUtitle

jawaban yang bagus, telah mencari cara mengakses informasi untuk sementara waktu, terima kasih
thatOneGuy

bagaimana jika kuncinya perlu lebih dari sekali! ['catatan'] dapat muncul lebih dari sekali, lalu apa yang bisa kita lakukan?
Milson

1
Milson - dalam hal ini, itu sebenarnya bukan "kunci"
Triptych

13

Anda dapat melakukan sesuatu seperti itu di ES6.

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

12

Inilah yang bagus dari peta Array

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

4

Ini akan berhasil:

 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

Dalam ide yang sama dari Nick Riggs tetapi saya membuat konstruktor, dan mendorong objek baru dalam array dengan menggunakannya. Itu menghindari pengulangan kunci-kunci kelas:

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

Saya akan membuat array dan kemudian menambahkan objek literal ke dalamnya.

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

Jika Anda ingin melangkah lebih jauh dari @tetra dengan ES6 Anda dapat menggunakan sintaks Penyebaran objek dan melakukan sesuatu seperti ini:

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

let people = new Array(10).fill().map((e, i) => {(...john, id: i});
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.