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.

codecowboy
sumber

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
    });
}
RaYell
sumber
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.

Triptych
sumber
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}
});
master tetra
sumber
12

Inilah yang bagus dari peta Array

var arr = oFullResponse.results.map(obj => ({
    key: obj.label,
    sortable: true,
    resizeable: true
}))
Tak berujung
sumber
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});
  }
Manjunath Raddi
sumber
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)));
}
JPIyo
sumber
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};
}
BenM
sumber
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});
}
Nick Riggs
sumber
7
Lebih baik init menggunakan array []daripada new Array().
RaYell
Diskusi menarik [] vs. Array baru () stackoverflow.com/questions/7375120/…
Adrian P.
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});
Pe Wu
sumber