2012-05-30 12 views
5

मेरे पास event ऑब्जेक्ट्स events नामक ऑब्जेक्ट्स हैं। प्रत्येक event में markets है, जिसमें market ऑब्जेक्ट वाली एक सरणी है। यहां के अंदर outcomes नामक एक और सरणी है, जिसमें outcome ऑब्जेक्ट्स हैं।Underscore.js .filter() और .any()

this question में, मैंने उन सभी घटनाओं को खोजने के लिए [अंडरस्कोर.जेएस] तरीका मांगा जिनके पास बाजार हैं जिनके पास test नाम की संपत्ति है। जवाब था:

// filter where condition is true 
_.filter(events, function(evt) { 

    // return true where condition is true for any market 
    return _.any(evt.markets, function(mkt) { 

     // return true where any outcome has a "test" property defined 
     return _.any(mkt.outcomes, function(outc) { 
      return outc.test !== "undefined" && outc.test !== "bar"; 
     }); 
    }); 
}); 

यह अच्छा काम करता है, लेकिन मैं सोच रहा हूँ मैं इसे कैसे बदल अगर मैं प्रत्येक बाजार के लिए परिणामों को फ़िल्टर करना चाहता था, इसलिए कि market.outcomes केवल संग्रहीत परिणामों कि bar के बराबर थे। वर्तमान में, यह सिर्फ मुझे बाजार दे रहा है जिनके पास कुछtest गुण हैं। मैं उन लोगों को बाहर करना चाहता हूं जो नहीं करते हैं।

+0

यह वास्तव में महान काम करता है? आपका भीतरूनी '.any()' कॉलबैक संदर्भ "परिणाम" लेकिन पैरामीटर "आउटसी" है ... – Pointy

+0

इसके अलावा, ऐसा लगता है कि आपको बस '.any() 'से' .all() से फ़्लिप करने की आवश्यकता है। एक विपरीत स्थिति के साथ। दूसरे शब्दों में, "जो भी हैं ..." से "सभी जो नहीं हैं ..." – Pointy

+0

क्षमा करें, टाइपो .... –

उत्तर

5

यह एक साधारण पाश बनाने, सरणी इन्हें हटाने का splice method का उपयोग कर:

var events = [{markets:[{outcomes:[{test:x},...]},...]},...]; 
for (var i=0; i<events.length; i++) { 
    var mrks = events[i].markets; 
    for (var j=0; j<mrks.length; j++) { 
     var otcs = mrks[j].outcomes; 
     for (var k=0; k<otcs.length; k++) { 
      if (! ("test" in otcs[k])) 
       otcs.splice(k--, 1); // remove the outcome from the array 
     } 
     if (otcs.length == 0) 
      mrks.splice(j--, 1); // remove the market from the array 
    } 
    if (mrks.length == 0) 
     events.splice(i--, 1); // remove the event from the array 
} 

इस कोड events सरणी से सभी परिणाम है कि कोई test संपत्ति, सभी खाली बाजारों और सभी खाली घटनाओं को हटा देगा।

एक अंडरस्कोर संस्करण है कि ऐसा दिखाई देगा:

events = _.filter(events, function(evt) { 
    evt.markets = _.filter(evt.markets, function(mkt) { 
     mkt.outcomes = _.filter(mkt.outcomes, function(otc) { 
      return "test" in otc; 
     }); 
     return mkt.outcomes.length > 0; 
    }); 
    return evt.markets.length > 0; 
}); 
+0

बहुत बढ़िया, धन्यवाद। हालांकि, इसे अंडरस्कोर के साथ हासिल किया जा सकता है (क्योंकि मैं पहले से ही पुस्तकालय का उपयोग कर रहा हूं और कोड शायद अधिक पढ़ने योग्य होगा)। –

+0

हां, यह संभव है। लेकिन अंडरस्कोर फ़िल्टर फ़ंक्शन नए सरणी उदाहरण बनाता है, जो तब से उन वस्तुओं को हटाने के बजाय, अप्रचलित सरणी को ओवरराइट करेगा। – Bergi

+0

@bergi डेटा को म्यूट करने के साथ कुछ भी गलत नहीं – Kloar

संबंधित मुद्दे