Jak utworzyć tablicę literałów obiektowych w pętli?

224

Muszę utworzyć tablicę literałów obiektowych w następujący sposób:

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

W takiej pętli:

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

Wartość keypowinna znajdować się results[i].labelw każdym elemencie tablicy.

codecowboy
źródło

Odpowiedzi:

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
źródło
18
możesz pominąć var obj = {bit, po prostu popchnij literał.
Peter Bailey,
3
obliczanie długości tylko raz to chyba dobry pomysł, postanawiam dodać var objdo kodu wyraźniejsze, oczywiście można go pominąć, można napisać cały scenariusz w jednej linii, jeśli chcesz :)
RaYell
3
@ kangax, Długość nie jest „obliczana”, to operacja O (1).
Tryptyk
8
@Triptych - Tak, ale jest to wyszukiwanie właściwości wykonywane przy każdej iteracji, które nie jest bezpłatne i można go uniknąć. Mikrooptymalizacja? Możliwie. Jest to również wartość „na żywo” - jeśli zmodyfikujesz tablicę w pętli, długość będzie się zmieniać podczas kolejnych iteracji, co może prowadzić do nieskończoności. Daj temu zegarek youtube.com/watch?v=mHtdZgou0qU
Peter Bailey
2
Tak, ale nie modyfikujesz tablicy przy każdej iteracji. Jeśli tak, w większości przypadków śmieszne byłoby porównanie z długością.
Tryptyk
61

Odpowiedź RaYell jest dobra - odpowiada na twoje pytanie.

Wydaje mi się jednak, że naprawdę powinieneś tworzyć obiekt z etykietami z podobiektami jako wartościami:

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;

Powyższe podejście powinno być znacznie szybsze i idiomatyczne niż przeszukiwanie całej tablicy obiektów w poszukiwaniu klucza dla każdego dostępu.

Tryptyk
źródło
+1 od kluczowego rozwiązania, ma większy sens i pomaga mi w zaspokojeniu moich potrzeb :)
winner_joiner
wygląda na to, że brakuje Ci średnika po ustawieniu klucza var?
superUntitled
fajna odpowiedź, szukałem przez jakiś czas dostępu do informacji, dziękuję
thatOneGuy
co jeśli klucz musi być więcej niż jeden raz! [„uwagi”] mogą wystąpić więcej niż jeden raz, co możemy zrobić?
Milson,
1
Milson - w tym przypadku tak naprawdę nie jest to „klucz”
Tryptyk
13

Możesz zrobić coś takiego w ES6.

new Array(10).fill().map((e,i) => {
   return {idx: i}
});
mistrz tetra
źródło
12

W tym jest dobra mapa Array #

var arr = oFullResponse.results.map(obj => ({
    key: obj.label,
    sortable: true,
    resizeable: true
}))
Nieskończony
źródło
4

To zadziała:

 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
źródło
4

Zgodnie z tym samym pomysłem Nicka Riggsa, ale tworzę konstruktor i pcham nowy obiekt w tablicy, używając go. Pozwala to uniknąć powtarzania kluczy klasy:

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
źródło
3

Chciałbym utworzyć tablicę, a następnie dołączyć do niej literały obiektowe.

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
źródło
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
źródło
7
Lepiej zainicjować tablicę za pomocą []zamiast new Array().
RaYell,
Interesująca dyskusja [] vs. nowy Array () stackoverflow.com/questions/7375120/…
Adrian P.
2

Jeśli chcesz posunąć się dalej niż @tetra z ES6, możesz użyć składni Spreadów obiektowych i zrobić coś takiego:

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

let people = new Array(10).fill().map((e, i) => {(...john, id: i});
Pe Wu
źródło