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.

Codecowboy
quelle

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

Triptychon
quelle
+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}
});
Tetra-Meister
quelle
12

Dies ist, was Array # Map gut kann

var arr = oFullResponse.results.map(obj => ({
    key: obj.label,
    sortable: true,
    resizeable: true
}))
Endlos
quelle
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});
  }
Manjunath Raddi
quelle
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)));
}
JPIyo
quelle
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};
}
BenM
quelle
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
quelle
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});
Pe Wu
quelle