Come creare una matrice di oggetti letterali in un ciclo?


224

Devo creare una matrice di oggetti letterali come questa:

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

In un ciclo come questo:

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

Il valore di keydovrebbe essere results[i].labelin ogni elemento dell'array.

Risposte:


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
puoi saltare il var obj = {bit, basta spingere il letterale stesso.
Peter Bailey,

3
calcolare la lunghezza solo una volta è probabilmente una buona idea, ho scelto di aggiungere un var objper rendere il codice più chiaro, ovviamente puoi saltarlo, puoi scrivere l'intero script in una riga se lo desideri :)
RaYell

3
@kangax, La lunghezza non è "calcolata", è un'operazione O (1).
Trittico,

8
@Triptych - Sì, ma è una ricerca di proprietà che esegui ad ogni iterazione, che non è gratuita e può essere evitata. Micro-ottimizzazione? Possibilmente. Inoltre, è un valore "live": se modifichi l'array nel loop, la lunghezza cambierà in iterazioni successive che potrebbero portare all'infinito. Dai a questo orologio youtube.com/watch?v=mHtdZgou0qU
Peter Bailey

2
Sì, ma non stai modificando l'array ogni iterazione. Se lo fossi, nella maggior parte dei casi sarebbe ridicolo fare un confronto con la lunghezza.
Trittico,

61

La risposta di RaYell è buona: risponde alla tua domanda.

Mi sembra però che dovresti davvero creare un oggetto codificato da etichette con oggetti secondari come valori:

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'approccio sopra dovrebbe essere molto più rapido e idiomatico rispetto alla ricerca dell'intero array di oggetti per una chiave per ogni accesso.


+1 dalla soluzione chiave, ha più senso e mi aiuta con le mie esigenze :)
winner_joiner

sembra che manchi un punto e virgola dopo aver impostato il tasto var?
superUntitled

bella risposta,
sto

cosa succede se la chiave deve essere più di una volta! ['note'] possono verificarsi più di una volta, quindi cosa possiamo fare?
Milson,

1
Milson - in quel caso, non è proprio una "chiave"
Trittico il

13

Puoi fare qualcosa del genere in ES6.

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

12

Questo è ciò in cui Array # map è bravo

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

4

Questo funzionerà:

 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

Nella stessa idea di Nick Riggs, ma io creo un costruttore e spingo un nuovo oggetto nell'array usandolo. Evita la ripetizione delle chiavi della 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

Vorrei creare l'array e quindi aggiungere i letterali dell'oggetto ad esso.

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


2

Se vuoi andare anche oltre @tetra con ES6 puoi usare la sintassi di diffusione dell'oggetto e fare qualcosa del genere:

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

let people = new Array(10).fill().map((e, i) => {(...john, id: i});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.