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.

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

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.


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


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

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

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


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});
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.