2014-05-21 4 views
7

Sto provando a strappare alcuni valori-chiave dall'array json e formare un altro array, di seguito è la struttura json campione. Ho una soluzione ora. Voglio solo sapere quali sono gli altri metodi per fare lo stesso.Pluck chiavi specifiche da json array

Esiste comunque il rifiuto delle chiavi dalla matrice di oggetti.

ingresso

var a = [{ 
    id: 1, 
    name: "First Name", 
    description: "" 
},{ 
    id: 2, 
    name: "Second Name", 
    description: "" 
}] 

uscita

[{ 
    id: 1, 
    name: "First Name" 
},{ 
    id: 2, 
    name: "Second Name" 
}] 

One Solution

var arr = []; 
_.each(a,function(key,value){ 
    arr.push(_.pick(key,'name','id')); 
}); 

AGGIORNATO

seconda soluzione

_.map(a, function(o) { return _.pick(o, 'name','id'); }); 
+0

Ho trovato le migliori opzioni qui http://stackoverflow.com/questions/22918613/underscore-remove-all-key-value-pairs-from-an-array-of-object – tomalex

risposta

4

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.

+0

Grazie per tutti i suggerimenti, davvero utile – tomalex

+0

Piacere mio, e penso di aver finito di aggiornarlo per il momento. Happy hacking! :-) –