Wie erstelle ich ein Array von Objektliteralen in einer Schleife?


224

Ich muss ein Array von Objektliteralen wie folgt erstellen:

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

In einer Schleife wie dieser:

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

Der Wert von keysollte results[i].labelin jedem Element des Arrays stehen.

Antworten:


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
Sie können das var obj = {Bit überspringen, indem Sie einfach das Literal selbst drücken.
Peter Bailey

3
Die Länge nur einmal zu berechnen ist wahrscheinlich eine gute Idee. Ich füge eine hinzu var obj, um den Code klarer zu machen. Natürlich können Sie sie überspringen. Sie können das gesamte Skript in einer Zeile schreiben, wenn Sie möchten :)
RaYell

3
@kangax, Länge ist nicht "berechnet", sondern eine O (1) -Operation.
Triptychon

8
@Triptych - Ja, aber es ist eine Eigenschaftssuche, die Sie bei jeder Iteration ausführen, die nicht kostenlos ist und vermieden werden kann. Mikrooptimierung? Möglicherweise. Es ist auch ein "Live" -Wert. Wenn Sie das Array in der Schleife ändern, ändert sich die Länge bei aufeinanderfolgenden Iterationen, die zu unendlich führen können. Geben Sie diesem eine Uhr youtube.com/watch?v=mHtdZgou0qU
Peter Bailey

2
Ja, aber Sie ändern das Array nicht bei jeder Iteration. Wenn Sie es wären, wäre es in den meisten Fällen lächerlich, mit der Länge zu vergleichen.
Triptychon

61

RaYells Antwort ist gut - sie beantwortet Ihre Frage.

Es scheint mir jedoch, dass Sie wirklich ein Objekt erstellen sollten, das durch Beschriftungen mit Unterobjekten als Werte verschlüsselt ist:

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;

Der obige Ansatz sollte viel schneller und idiomatischer sein als das Durchsuchen des gesamten Objektarrays nach einem Schlüssel für jeden Zugriff.


+1 seit der Schlüssellösung, macht mehr Sinn und hilft mir bei meinen Bedürfnissen :)
won_joiner

Es sieht so aus, als ob Ihnen ein Semikolon fehlt, nachdem Sie den var-Schlüssel festgelegt haben.
SuperUntitled

nette Antwort, habe eine Weile gesucht, wie ich auf die Informationen zugreifen kann, danke
thatOneGuy

Was ist, wenn der Schlüssel mehr als einmal sein muss? ['Notizen'] können mehrmals vorkommen. Was können wir dann tun?
Milson

1
Milson - in diesem Fall ist es nicht wirklich ein "Schlüssel"
Triptychon

13

Sie können so etwas in ES6 tun.

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

12

Dies ist, was Array # Map gut kann

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

4

Das wird funktionieren:

 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

In der gleichen Idee von Nick Riggs erstelle ich aber einen Konstruktor und schiebe ein neues Objekt in das Array, indem ich es benutze. Es vermeidet die Wiederholung der Schlüssel der Klasse:

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

Ich würde das Array erstellen und dann die Objektliterale daran anhängen.

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

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

7
Es ist besser, ein Array mit []anstelle von zu initiieren new Array().
RaYell

Interessante Diskussion [] gegen neues Array () stackoverflow.com/questions/7375120/…
Adrian P.

2

Wenn Sie mit ES6 noch weiter als @tetra gehen möchten, können Sie die Object Spread-Syntax verwenden und Folgendes tun:

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

let people = new Array(10).fill().map((e, i) => {(...john, id: i});
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.