2012-07-28 9 views
7

Ich habe ein Objekt wie folgt:Wie Verwenden von Underscore.js-Filter mit einem Objekt?

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

etc ..

Wie kann ich den Unterstrich _.filter() verwenden Sie die Elemente nur, um wieder zurück, wo === wahr ausgewählt?

Ich hatte nie die Notwendigkeit, auf Ebenen mit _.filter() zu gehen. So etwas wie

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

Danke

+0

Könnten Sie das Objektformat klären? Es sieht wie ein Hash von Arrays aus, die an E-Mail-Adressen verschlüsselt sind. – rjz

+0

das ist richtig, wie kann ich das klären? – AnApprentice

+0

Und Sie versuchen, Elemente aus dem Hash, wo * alle * der Array-Elemente haben ausgewählt "= = wahr"? – rjz

Antwort

8

Wenn Sie alle Array-Elemente von jedem E-Mail-Adresse ziehen wollen, wo selectedtrue ist, können Sie wie so laufen:

var selected = []; 

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

Wenn Sie nur wollen die Arrays, wo alle Elemente sind selected, können Sie stattdessen etwas wie das:

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

Danke, für die erste Antwort, was ist "E-Mail in obj "und" obj [email] "das Objekt, das ich habe, heißt" emailLists ", vorausgesetzt, dass Sie aktualisieren können? thx – AnApprentice

+0

komisch, ich bekomme einen "Uncaught SyntaxError: Unexpected identifier" – AnApprentice

+0

Sicher.'obj' hätte' emailLists' sein sollen; 'Email' ist nur der Schlüssel jedes Elements im Objekt. Wo kommt dieser Fehler auf? (Ich habe nicht getestet!): ^) – rjz

1

Ich habe ein Objekt namens allFilterValues ​​folgendes enthält:

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

Dies ist hässlich, aber Sie eine gefragt unterstreichen basierte Möglichkeit, ein Objekt zu filtern. So gab ich nur die Filterelemente zurück, die nicht-falsche Werte hatten; Sie können die return-Anweisung des Filters wechseln, was Sie brauchen:

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

Ausgang (JSON/Zeichenfolge):

{"originDivision":"GFC"} 
4

Unders der Filtermethode auf einem Objekt arbeiten als Hash oder Wörterbuch verwendet wird, , aber es wird ein Array der aufzählbaren Werte des Objekts zurückgeben und die Schlüssel entfernen. Ich brauchte eine Funktion einen Hash durch seine Werte zu filtern, die die Schlüssel erhalten würde, und schrieb diese 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 

Wenn Sie nicht Coffeescript verwenden, hier ist das kompilierte Ergebnis in Javascript, ein wenig aufgeräumt:

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() ist großartig!

+0

Ich habe den Schlüssel als zweiten Parameter eingefügt, wie Underscore '_.filter()' tut. Hoffe, das ist cool! :) –

-1

Vielleicht möchten Sie eine einfachste Weg

_.filter(me.collections, { selected: true}) 
Verwandte Themen