2012-07-28 32 views
7

मैं बहुत की तरह एक वस्तु है:किसी ऑब्जेक्ट के साथ Underscore.js फ़िल्टर का उपयोग कैसे करें?

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

आदि ..

मैं अंडरस्कोर _.filter() कैसे उपयोग कर सकते हैं वापस केवल आइटम जहां चयनित वापस जाने के लिए === सच?

मुझे _.filter() के साथ परतों पर जाने की आवश्यकता नहीं है।

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

की तरह कुछ आप

+0

आप वस्तु प्रारूप स्पष्ट कर सके हैं? ऐसा लगता है कि ई-मेल पते के लिए सरणी के हैंश की हैश? – rjz

+0

यह सही है, मैं कैसे स्पष्टीकरण दे सकता हूं? – AnApprentice

+0

और आप हैश से आइटम खींचने की कोशिश कर रहे हैं, जहां सरणी तत्वों के * सभी * में चयनित == सत्य' है? – rjz

उत्तर

8

धन्यवाद आप किसी भी ई-मेल एड्रेस जहां selectedtrue है से सभी सरणी तत्वों को खींचने के लिए चाहते हैं, आप तो जैसे पुनरावृति कर सकते हैं:

var selected = []; 

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

आप अगर केवल उन एरे को खींचना चाहते हैं जहां सभी तत्व selected हैं, तो आप इसके बजाय ऐसा कुछ कर सकते हैं:

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

धन्यवाद, पहले जवाब के लिए, "ओबीजी में ईमेल क्या है "और" obj [ईमेल] "मेरे पास ऑब्जेक्ट को" ईमेललिस्ट "कहा जाता है, क्या आप अपडेट कर सकते हैं? thx – AnApprentice

+0

अजीब, मुझे एक "अनकही सिंटेक्स त्रुटि: अप्रत्याशित पहचानकर्ता" मिल रहा है – AnApprentice

+0

निश्चित रूप से।'obj'' ईमेललिस्ट 'होना चाहिए था; 'ईमेल' ऑब्जेक्ट में प्रत्येक तत्व की कुंजी है। वह त्रुटि कहां आ रही है? (मैंने परीक्षण नहीं किया!): ^) – rjz

1

मैं एक वस्तु बुलाया allFilterValues ​​निम्नलिखित युक्त है:

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

यह बदसूरत है लेकिन आप एक के लिए कहा रेखांकित एक वस्तु फिल्टर करने के लिए आधारित तरीका है। इस प्रकार मैंने केवल उन फ़िल्टर तत्वों को वापस कर दिया जिनके पास गैर-झूठे मूल्य थे; आप जो कुछ भी आप की जरूरत करने के लिए फिल्टर की वापसी बयान स्विच कर सकते हैं:

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

आउटपुट (JSON/stringified):

{"originDivision":"GFC"} 
4

अंडरस्कोर के फिल्टर विधि एक वस्तु पर काम करेंगे एक हैश या शब्दकोश के रूप में इस्तेमाल किया जा रहा , लेकिन यह ऑब्जेक्ट के समेकित मानों की एक सरणी वापस कर देगा और चाबियाँ निकाल देगा। मैं अपने मूल्यों से एक हैश कि कुंजी की रक्षा करेगा फिल्टर करने के लिए एक समारोह की जरूरत है, और 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 

आप Coffeescript उपयोग नहीं कर रहे हैं, तो यहाँ जावास्क्रिप्ट में संकलित परिणाम, ऊपर एक छोटे से साफ है:

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} 

टीएल; डीआर: Object.keys() बहुत अच्छा है!

+0

मैंने दूसरे पैरामीटर के रूप में कुंजी को जोड़ा, जैसा अंडरस्कोर का '_.filter()' करता है। उम्मीद है कि यह अच्छा है! :) –

-1

हो सकता है कि आप एक आसान तरीका है

_.filter(me.collections, { selected: true}) 
संबंधित मुद्दे