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.