2012-02-17 10 views
21

Qualcuno sa di un plug-in "pluck" che corrisponde al metodo dell'array di sottolineatura?Equivalente di Underscore.js _.pluck in jQuery

pluck_.pluck(list, propertyName) 

Una versione conveniente di quello che è forse il caso d'uso più comune per la mappa: l'estrazione di un elenco di valori di proprietà.

var stooges = [{name : 'moe', age : 40}, {name : 'larry', age : 50}, {name : 'curly', age : 60}]; 
_.pluck(stooges, 'name'); 
=> ["moe", "larry", "curly"] 

Google non mi sta aiutando molto oggi. Tutti gli indicatori molto apprezzati

risposta

30

È possibile farlo con un'espressione;

var arr = $.map(stooges, function(o) { return o["name"]; }) 
+2

Stavo per utilizzare la soluzione di cui sopra, ma in seguito ho verificato che è diverso da _.pluck in alcuni casi limite. Se la proprietà 'name' come sopra usata è nulla o indefinita in qualsiasi oggetto dell'array, questa funzione semplicemente ometterà quell'elemento dall'output di arr, lasciando una matrice più piccola di quella con cui è iniziato. Quanto segue copre: var arr = []; $ .each (stooges, function (i, o) {return arr.push (o ["name"]);}); – Julie

9

E 'abbastanza semplice da implementare questa funzionalità da soli:

function pluck(originalArr, prop) { 
    var newArr = []; 
    for(var i = 0; i < originalArr.length; i++) { 
     newArr[i] = originalArr[i][prop]; 
    } 
    return newArr; 
} 

Tutto ciò che fa è iterare sugli elementi dell'array originale (ciascuno dei quali è un oggetto), ottenere la proprietà che si specificare da quell'oggetto e posizionarlo in una nuova matrice.

22

basta scrivere il proprio

$.pluck = function(arr, key) { 
    return $.map(arr, function(e) { return e[key]; }) 
} 
1

In caso semplice:

var arr = stooges.map(function(v) { return v.name; }); 

più generalizzata:

function pluck(list, propertyName) { 
    return list.map(function (v) { return v[propertyName]; }) 
} 

Ma, secondo me, non si dovrebbe applicare come strumento funzione, ma usa il caso semplice sempre.