Vorrei modificare una cosa nella prima soluzione, i nomi dei parametri nel callback _.each()
. In realtà è necessario solo un parametro qui, proprio come la seconda versione:
var arr = [];
_.each(a,function(o){
arr.push(_.pick(o,'name','id'));
});
Ma la tua seconda soluzione utilizzando _.map()
è più bello - molto pulito e sembra perfettamente bene.
La prima versione è in realtà il modo in cui _.map()
funziona internamente. Ecco il source code per _.map()
:
// Return the results of applying the iterator to each element.
// Delegates to **ECMAScript 5**'s native `map` if available.
_.map = _.collect = function(obj, iterator, context) {
var results = [];
if (obj == null)
return results;
if (nativeMap && obj.map === nativeMap)
return obj.map(iterator, context);
each(obj, function(value, index, list) {
results.push(iterator.call(context, value, index, list));
});
return results;
};
Come si può vedere, è fondamentalmente lo stesso codice come la vostra prima versione insieme ad alcune cose in più.
Hai chiesto di rifiutare le chiavi; è possibile farlo con la funzione _.omit()
, che è l'opposto di _.pick()
: si elencano i nomi di proprietà che si desidera omettere, non quelli che si desidera copiare. Quindi, con i vostri dati di test, questo produrrebbe la stessa cosa come le altre versioni:
_.map(a, function(o) { return _.omit(o, 'description'); });
La differenza sarebbe che se ci fossero proprietà aggiuntive nei dati di input, questa versione sarebbe copiare queste proprietà in uscita troppo. La versione che utilizza _.pick()
avrà solo id
e name
nell'output.
Il mio unico suggerimento aggiuntivo sarebbe che se hai a che fare con le matrici molto grandi che sarebbe stato un po 'più veloce per fare l'equivalente di _.pick()
te stesso:
var result = _.map(a, function(o) {
return { name: o.name, id: o.id };
});
O anche più veloce di utilizzare il proprio ciclo:
var result = [];
for(var i = 0, n = a.length; i < n; ++i) {
var o = a[i];
result[i] = { name: o.name, id: o.id };
}
Ma per un array di dimensioni ridotte si può anche andare con il codice più semplice.
Ho trovato le migliori opzioni qui http://stackoverflow.com/questions/22918613/underscore-remove-all-key-value-pairs-from-an-array-of-object – tomalex