2014-10-19 16 views
8

Qual è l'algoritmo più veloce per ottenere da qualcosa di simile:Convertire array JavaScript di 2 array di elementi in coppie chiave-valore degli oggetti

var array = [ [1,'a'], [2,'b'], [3,'c'] ]; 

a qualcosa di simile:

Object { 1: "a", 2: "b", 3: "c" } 

finora questo è quello che ho trovato:

function objectify(array) { 
    var object = {}; 
    array.forEach(function(element) { 
     object[element[0]] = element[1]; 
    }); 
    return object; 
} 

che funziona bene, ma sembra un po 'goffo. C'è un modo migliore? Qualcosa come reduce() funzionerà e sarebbe più veloce?

risposta

9

Si potrebbe infatti utilizzare Array.prototype.reduce:

function objectify(array) { 
    return array.reduce(function(p, c) { 
     p[c[0]] = c[1]; 
     return p; 
    }, {}); 
} 

dove p è il risultato dell'iterazione precedente, inizialmente {}, e c è l'elemento corrente della matrice.

È improbabile che sia più veloce di array.forEach, ma è più pulito di IMHO. Non credo ci sia un'implementazione più semplice di questa.

NB: una funzione per fare esattamente questo esiste già nel Underscore libreria: _.object(array)

2

si può avvolgere l'intera cosa all'interno Array.prototype.reduce, come questo

function objectify(array) { 
    return array.reduce(function(result, currentArray) { 
     result[currentArray[0]] = currentArray[1]; 
     return result; 
    }, {}); 
} 

console.log(objectify([ [1, 'a'], [2, 'b'], [3, 'c'] ])); 
# { '1': 'a', '2': 'b', '3': 'c' } 

Stiamo solo accumulando il valore-chiave coppie nell'oggetto result e infine il risultato di reduce sarà l'oggetto result e lo restituiremo come risultato effettivo.

1

Lodash ha un metodo _.fromPairs che fa esattamente questo.

Dalla documentazione:
_.fromPairs([['a', 1], ['b', 2]]); // => { 'a': 1, 'b': 2 }

1

versione Terse utilizzando la sintassi moderna:

let objectify = a => a.reduce((o,[k,v]) => (o[k]=v,o), {}); 

Io uso questa tecnica come parte di un laconico parser stringa di query:

// Converts "?foo=bar&j=1&go" into { foo:'bar', j:'1', go:true } 
function parseQueryString(qs) { 
    var q = decodeURIComponent; 
    return qs.replace(/^\?/,'').split('&').map(s => s.split('=')) 
      .reduce((o,[k,v]) => (o[q(k)] = v?q(v):true, o), {}); 
} 
Problemi correlati