2012-06-13 13 views
8

Ho un gamma di canali che voglio trasformare in un singolo oggetto (channelSettings) con un vero/falso proprietà per ciascun canale.come costruire un oggetto javascript usando una matrice e la funzione mappa?

Ho funzionato usando il codice seguente ma sembra dettagliato. C'è modo di farlo senza la "temp" var? Se riesco a farcela, allora potrei anche cavalcare la funzione di auto-esecuzione.

var channels = ["TV", "Billboard", "Spot TV"]; 


var channelSettings = function() { 
    var temp = {}; 

    channels.map(function(itm, i, a) { 
     var channel = itm.toLowerCase().replace(" ", ""); 
     temp[channel] = false; 
    }); 

    return temp; 
}(); 

Credo che sto cercando di ottenere la funzione di mappa per restituire un oggetto con proprietà invece di un array. È possibile? È mal guidato? Suggerimenti?

Questo è quello che spero che sembra alla fine:

var channels = ["TV", "Billboard", "Spot TV"]; 

var channelSettings = channels.map(function(itm, i, a) { 
     var channel = itm.toLowerCase().replace(" ", ""); 
     return ????; 
}); 
+1

Può essere un po 'prolisso, ma è anche _clear_. Io voterei per lasciarlo così com'è. –

risposta

7

Utilizzare invece una funzione .reduce().

var channelSettings = channels.reduce(function(obj, itm) { 
     var channel = itm.toLowerCase().replace(" ", ""); 
     obj[channel] = false; 

     return obj; 
}, {}); 

DEMO:http://jsfiddle.net/MjW9T/


Il primo parametro fa riferimento l'articolo precedentemente restituito, tranne che per la prima iterazione, dove fa riferimento sia il primo elemento nella matrice, o la testa di serie oggetto, che abbiamo fornito come oggetto vuoto.

Il secondo parametro fa riferimento al valore corrente nell'array. Finché restituiamo sempre obj, il primo parametro sarà sempre quell'oggetto, così come il valore di ritorno finale.

+0

Bella spiegazione, Thx! – DanielEli

+0

@DanielEli: prego. –

0

hmm .. sembra avvolgendolo in una funzione come questa sarebbe farlo.

function toObject(arr) { 
    var rv = {}; 
    for (var i = 0; i < arr.length; ++i) 
    if (arr[i] !== undefined) rv[arr[i]] = true; 
    return rv; 
} 
3

La funzione map accetta una matrice e restituisce una matrice. Nient'altro. Ma è possibile utilizzare reduce:

var settings = ["TV", "Billboard", "Spot TV"].reduce(function(obj, item) { 
    obj[item.toLowerCase().replace(" ", "")] = false; // probably too concise 
    return obj // yay, we can skip a semi-colon here :-P 
}, {}); 

Ebbene, "Non sono io sono" mi ha battuto sul tempo, ma in ogni caso:
map non solo restituisce le matrici, ma anche restituisce solo le matrici della stessa lunghezza dell'originale. È pensato per trasformare i valori di un array 1: 1 in un nuovo array. reduce è pensato per "ridurre un array ad un singolo valore". Quindi il suo uso qui.

Se si utilizza un ciclo lineare for o il metodo forEach per aggiungere proprietà a un oggetto, è necessario dichiararlo. Quindi, no, non puoi fare a meno di temp nel tuo codice (a meno che non usi reduce invece di un ciclo).

Maggiori informazioni sul MDN:

  1. mappa: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map
  2. ridurre: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/Reduce
+0

e una spiegazione eccellente anche qui! (Non avrei dovuto difendere la mia determinazione di controllo verde in tribunale ..) molti thx! – DanielEli

+0

@RobG Ah, collegamenti MDN - Ho completamente dimenticato di aggiungere quelli. Grazie per la modifica – Flambino

+0

ho finito per utilizzare una versione più chiara. var key = item.toLowerCase(). Replace ("", ""); obj [chiave] = falso; ritorno obj – DanielEli

Problemi correlati