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.

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

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.


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

12

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

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

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

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

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

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
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});
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.