2012-06-17 8 views
23

Ho bisogno di generare un paio di oggetti dalle liste in Javascript. In Python, mi piacerebbe scrivere questo:In Javascript una comprensione del dizionario, o una mappa di oggetti `

{key_maker(x): val_maker(x) for x in a_list} 

Un altro modo di porsi è fa non esiste qualcosa come jQuery.map() che aggrega gli oggetti? Ecco la mia ipotesi (non funziona):

var result = {} 
$.map(a_list, function(x) { 
    $.extend(result, {key_maker(x): val_maker(x)}) 
}) 
+1

Cordiali saluti, il vostro 'versione $ .extend' non funzionerà. Gli identificatori di proprietà nella notazione letterale dell'oggetto non possono essere il risultato di un'espressione. Questo codice fallirà ... '{key_maker (x): val_maker (x)}' –

+1

@amnotiam Non ce ne siamo resi conto! Grazie – Cuadue

risposta

23

Supponendo a_list è un array, il più vicino sarebbe probabilmente utilizzare .reduce().

var result = a_list.reduce(function(obj, x) { 
    obj[key_maker(x)] = val_maker(x); 
    return obj; 
}, {}); 

comprensioni di array sono probabilmente arrivando in una futura versione di JavaScript.


È possibile patchare implementazioni non ES5 conforme alle compatibility patch from MDN.


Se a_list non è un array, ma un oggetto semplice, è possibile utilizzare Object.keys() per eseguire la stessa operazione.

var result = Object.keys(a_list).reduce(function(obj, x) { 
    obj[key_maker(a_list[x])] = val_maker(a_list[x]); 
    return obj; 
}, {}); 
+0

Se si utilizza una versione di JS che non ha 'reduce', non penso nemmeno che jQuery l'abbia mai aggiunta. Ma sottolineatura ce l'ha. –

+0

@MarkReed: vero. Ho aggiornato con un collegamento alla patch di compatibilità MDN. –

+0

jQuery non ha ancora ridotto (ancora). Puoi trovare alcune implementazioni nel suo trac qui: http://bugs.jquery.com/ticket/1886 –

2

Vecchia domanda, ma la risposta è leggermente cambiata nelle nuove versioni di Javascript. Con ES2015 (ES6) è possibile ottenere un oggetto di comprensione one-liner in questo modo:

a_list.reduce((obj, x) => Object.assign(obj, { [key_maker(x)]: value_maker(x) }), {}) 
2

ES5 introdotto Map per un OrderedDict. Una Mappa comprensione potrebbe essere simile:

Map(Array.map(function(o){return[ key_maker(o), val_maker(o) ]})) 

Esempio:

> a_list = [ {x:1}, {x:2}, {x:3} ] 
< [ Object, Object, Object ] 
> 
> let dict = new Map(a_list.map(function(o){return[ o.x, o.x**2 ]})) 
< Map[3] 
< 0 : {1 => 1} 
< 1 : {2 => 4} 
< 2 : {3 => 9} 
> 
> dict.get(2) 
< 4 
Problemi correlati