2013-11-14 7 views
5

Quindi la funzione _.map() in underscore non restituisce un oggetto, ma li accetta. Esiste un modo per restituire esattamente lo stesso oggetto che impiega?Oggetto restituito da _.map()

var _ = require("underscore"); 

var cars = { 
    "mom": { 
     "miles": "6", 
     "gas": "4" 
    }, 
    "dad": { 
     "miles": "6", 
     "gas": "4" 
    } 
} 

var regurgitate_cars = _.map(cars, function(value, key){ 
    return value; 
}); 

/* 
[ { miles: '6', gas: '4' }, { miles: '6', gas: '4' } ] 
*/ 

var regurgitate_cars = _.map(cars, function(value, key){ 
    var transfer = {}; 
    transfer[key] = value; 
    return transfer; 
}); 

/* 
[ { mom: { miles: '6', gas: '4' } }, 
    { dad: { miles: '6', gas: '4' } } ] 
*/ 
+0

Che cosa stai cercando di ottenere? Copia superficiale/profonda di un oggetto? –

+1

Vedere mapValue per il carattere di sottolineatura https://github.com/jashkenas/underscore/issues/220 – megawac

risposta

6

È possibile utilizzare _.object() per trasformarlo in un oggetto.

var regurgitate_cars = _.object(
    _.map(cars, function(value, key){ 
     return [key, value]; 
    }) 
); 

Quanto a farlo direttamente con _.map, che avrebbe dovuto riscrivere mappa per farlo.

+2

È necessario "restituire [chiave, valore]" affinché funzioni ...? – McGarnagle

+0

@ McGarnagle, buona chiamata. Hai ragione, e il post è stato aggiornato. E sembra molto più succinto. – EmptyArsenal

1

map restituisce un array quindi non c'è modo si potrebbe ottenere per restituire l'oggetto originale con fuori scrivere il proprio. Vedi documentation:

produce una nuova matrice di valori mappando ciascun valore nell'elenco attraverso una funzione trasformazione (iterator). Se esiste il metodo della mappa nativa, verrà utilizzato invece . Se list è un oggetto JavaScript, gli argomenti di iterator saranno (valore, chiave, elenco).

0

Non è possibile restituire un oggetto con l'implementazione corrente della mappa. It's been suggested che la libreria aggiunga una funzione .mapValues() che faccia ciò che ti piace. Ecco come si dovrebbe aggiungere al vostro codice:

_.mixin({ 
    mapValues: function (input, mapper) { 
     return _.reduce(input, function (obj, v, k) { 
      obj[k] = mapper(v, k, input); 
     }, {}); 
    } 
}); 

Ora è possibile utilizzare mapValues ​​per restituire un nuovo oggetto:

var regurgitate_cars = _.mapValues(cars, function(value, key){ 
    return value; 
}); 
5

_.map() sarà sempre restituire un array, ma è possibile ottenere il comportamento con _.reduce() :

var regurgitateCars = _.reduce(cars, function(memo, value, key) { 
    memo[key] = value; 
    return memo; 
}, cars); 

si noti che questo modificherà e restituire l'oggetto originale, se si voleva una copia è possibile fornire un oggetto vuoto come terzo argomento, che b E usato come argomento memo alla prima chiamata della funzione anonima:

var regurgitateCars = _.reduce(cars, function(memo, value, key) { 
    memo[key] = value; 
    return memo; 
}, {});