Comment créer un tableau de littéraux d'objets dans une boucle?

224

J'ai besoin de créer un tableau de littéraux d'objets comme celui-ci:

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

Dans une boucle comme celle-ci:

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

La valeur de keydoit être results[i].labeldans chaque élément du tableau.

codecowboy
la source

Réponses:

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
la source
18
vous pouvez sauter le var obj = {bit, il suffit de pousser le littéral lui-même.
Peter Bailey
3
calculer la longueur une seule fois est probablement une bonne idée, j'ai choisi d'ajouter un var objpour rendre le code plus clair, bien sûr vous pouvez le sauter, vous pouvez écrire le script entier sur une seule ligne si vous le souhaitez :)
RaYell
3
@kangax, la longueur n'est pas "calculée", c'est une opération O (1).
Triptyque
8
@Triptych - Oui, mais c'est une recherche de propriété que vous exécutez à chaque itération, ce qui n'est pas gratuit et peut être évité. Micro-optimisation? Peut-être. De plus, c'est une valeur "en direct" - si vous modifiez le tableau dans la boucle, la longueur changera sur des itérations successives qui pourraient conduire à l'infini. Donnez-lui une montre youtube.com/watch?v=mHtdZgou0qU
Peter Bailey
2
Oui, mais vous ne modifiez pas le tableau à chaque itération. Si vous l'étiez, il serait ridicule de comparer la longueur de toute façon dans la plupart des cas.
Triptyque
61

La réponse de RaYell est bonne - elle répond à votre question.

Il me semble cependant que vous devriez vraiment créer un objet incrusté d'étiquettes avec des sous-objets comme valeurs:

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;

L'approche ci-dessus devrait être beaucoup plus rapide et idiomatique que de rechercher dans le tableau d'objets entier une clé pour chaque accès.

Triptyque
la source
+1 depuis la solution clé, a plus de sens et m'aide avec mes besoins :)
winner_joiner
il semble qu'il vous manque un point-virgule après avoir défini la clé var?
superUntitled
belle réponse, cherchait comment accéder à l'information depuis un moment, merci
thatOneGuy
que faire si la clé doit être plusieurs fois! ['notes'] peut se produire plus d'une fois alors que pouvons-nous faire?
Milson
1
Milson - dans ce cas, ce n'est pas vraiment une "clé"
Triptyque
13

Vous pouvez faire quelque chose comme ça dans ES6.

new Array(10).fill().map((e,i) => {
   return {idx: i}
});
tetra master
la source
12

C'est ce à quoi les cartes Array # sont bonnes

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

Cela fonctionnera:

 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
la source
4

Dans la même idée de Nick Riggs mais je crée un constructeur, et un push un nouvel objet dans le tableau en l'utilisant. Il évite la répétition des clés de la classe:

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
la source
3

Je créerais le tableau et y ajouterais ensuite les littéraux d'objet.

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
la source
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
la source
7
Il vaut mieux initier un tableau en utilisant []au lieu de new Array().
RaYell
Discussion intéressante [] vs new Array () stackoverflow.com/questions/7375120/…
Adrian P.
2

Si vous voulez aller encore plus loin que @tetra avec ES6, vous pouvez utiliser la syntaxe de propagation d'objet et faire quelque chose comme ceci:

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

let people = new Array(10).fill().map((e, i) => {(...john, id: i});
Pe Wu
la source