web-dev-qa-db-fra.com

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

J'ai besoin de créer un tableau de littéraux d'objet 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 key doit être results[i].label dans chaque élément du tableau.

208
codecowboy
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
    });
}
363
RaYell

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

Il me semble cependant que vous devriez vraiment créer un objet avec des é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 chercher dans l'ensemble du tableau d'objets une clé pour chaque accès.

57
Triptych

C’est ce que Array # map sont bons à

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

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

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
Manjunath Raddi

Je créerais le tableau et y ajouterais 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
BenM
var myColumnDefs = new Array();

for (var i = 0; i < oFullResponse.results.length; i++) {
    myColumnDefs.Push({key:oFullResponse.results[i].label, sortable:true, resizeable:true});
}
2
Nick Riggs

Vous pouvez faire quelque chose comme ça dans ES6.

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

Si vous voulez aller encore plus loin que @tetra avec ES6, vous pouvez utiliser la syntaxe dite " Object spread " et procéder comme suit:

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

let people = new Array(10).fill().map((e, i) => {

    return {
        ...john,
        id: i
    }
});
0
Pe Wu