2012-07-28 11 views
7

Ho un oggetto in questo modo:Come utilizzare il filtro Underscore.js con un oggetto?

> Object 
    > [email protected]: Array[100] 
    > [email protected]: Array[4] 
    > 0 
     id : 132 
     selected : true 
    > 1 
     id : 51 
     selected : false 

ecc ..

Come posso utilizzare il carattere di sottolineatura _.filter() per tornare indietro solo gli elementi selezionati in cui === vero?

Non ho mai avuto bisogno di scendere ai livelli con _.filter(). Qualcosa di simile

var stuff = _.filter(me.collections, function(item) { 
    return item[0].selected === true; 
}); 

Grazie

+0

Potrebbe chiarire il formato oggetto? Sembra un hash di array digitato per indirizzi e-mail? – rjz

+0

è corretto, come posso chiarire? – AnApprentice

+0

E stai cercando di estrarre gli elementi dall'hash dove * tutti * degli elementi dell'array hanno 'selected == true'? – rjz

risposta

8

Se si vuole tirare tutti gli elementi dell'array da qualsiasi indirizzo di posta elettronica dove selected è true, è possibile iterare in questo modo:

var selected = []; 

for (email in emailLists) { 
    selected.concat(_.filter(emailLists[email], function (item) { 
     return item.selected === true; 
    })); 
} 

Se solo vuoi estrarre gli array dove tutti gli elementi sono selected, potresti invece fare qualcosa del genere:

var stuff = _.filter(me.collections, function(item) { 
    return _.all(item, function (jtem) { 
     jtem.selected === true; 
    }); 
}); 
+0

Grazie, per la prima risposta, che cos'è "email in obj "e" obj [email] "l'oggetto che ho è chiamato" emailLists "dato che, puoi aggiornare? grazie – AnApprentice

+0

strano, sto ricevendo un "Uncaught SyntaxError: Unexpected Identifier" – AnApprentice

+0

Sure.'obj' avrebbe dovuto essere' emailLists'; 'email' è solo la chiave di ogni elemento nell'oggetto. Dov'è questo errore? (Non ho provato!): ^) – rjz

1

Ho un oggetto chiamato allFilterValues ​​contenenti le seguenti:

{"originDivision":"GFC","originSubdivision":"","destinationDivision":"","destinationSubdivision":""} 

Questo è brutto ma ha chiesto un sottolineatura modo base per filtrare un oggetto. Ecco come ho restituito solo gli elementi del filtro che avevano valori non falsi; è possibile passare l'istruzione return del filtro per tutto ciò che serve:

var nonEmptyFilters = _.pick.apply({}, [allFilterValues].concat(_.filter(_.keys(allFilterValues), function(key) { 
     return allFilterValues[key]; 
    }))); 

uscita (JSON/stringata):

{"originDivision":"GFC"} 
4

metodo del filtro di sottolineatura lavorerà su un oggetto che viene usato come un hash o dizionario , ma restituirà una matrice dei valori enumerabili dell'oggetto e rimuoverà le chiavi. Avevo bisogno di una funzione per filtrare un hash dai suoi valori che avrebbe conservato le chiavi, e scritto questo in CoffeeScript:

hash_filter: (hash, test_function) -> 
    keys = Object.keys hash 

    filtered = {} 
    for key in keys 
    filtered[key] = hash[key] if test_function hash[key] 
    filtered 

Se non si utilizza CoffeeScript, ecco il risultato compilato in Javascript, ripulito un po ':

hash_filter = function(hash, test_function) { 
    var filtered, key, keys, i; 
    keys = Object.keys(hash); 
    filtered = {}; 
    for (i = 0; i < keys.length; i++) { 
    key = keys[i]; 
    if (test_function(hash[key])) { 
     filtered[key] = hash[key]; 
    } 
    } 
    return filtered; 
} 


hash = {a: 1, b: 2, c: 3}; 
console.log((hash_filter(hash, function(item){return item > 1;}))); 
// Object {b=2, c=3} 

TL; DR: Object.keys() è fantastico!

+0

Ho aggiunto la chiave come secondo parametro, come fa '_.filter()' di Underscore. Spero sia bello! :) –

-1

forse si vuole un modo più semplice

_.filter(me.collections, { selected: true}) 
Problemi correlati