2013-02-27 132 views
20

पर आधारित ऑब्जेक्ट्स की एक सरणी फ़िल्टर करें, मैं किसी अन्य के आधार पर ऑब्जेक्ट्स की एक सरणी फ़िल्टर करने की कोशिश कर रहा हूं। सामान्य संपत्ति आईडी id। मुझे यकीन नहीं है कि फिल्टर + प्रत्येक इसे करने या मानचित्र को कम करने का सबसे अच्छा तरीका है। वैसे भी, कोड नीचे out खाली सूची के रूप में काम नहीं करता है।underscore.js अन्य

var aaa = [ 
    {name: "AAA", id: 845}, 
    {name: "BBB", id: 839}, 
    {name: "CCC", id: 854} 
]; 
var bbb = [ 
    {id: 839}, 
    {id: 854} 
]; 

var out = _.filter(aaa, function(val){ 
    return _.each(this, function(val2){ 
     return val['id'] === val2['id'] 
    }); 
}, bbb); 

उत्तर

37

बस बनाने के लिए एक वैध आईडी के "सेट" और प्रयोग "सेट" कि छानने करना है:

var aaa = [ 
    {name: "AAA", id: 845}, 
    {name: "BBB", id: 839}, 
    {name: "CCC", id: 854} 
]; 
var bbb = [ 
    {id: 839}, 
    {id: 854} 
]; 

var ids = {}; 
_.each(bbb, function (bb) { ids[bb.id] = true; }); 

var out = _.filter(aaa, function (val) { 
    return ids[val.id]; 
}, bbb); 

भरने ids तेजी से है, यह n * में है amortized हे (1), यानी ओ (एन)। फ़िल्टरिंग के लिए वही है।

यदि आप आंतरिक लूप में each(…) का उपयोग करते हैं, तो आपके पास ओ (एन²) होगा। बड़े डेटा सेट के लिए यह बहुत धीमा हो जाएगा। इसके अलावा अतिरिक्त घोंसले को पहली नज़र में कोड को पढ़ने/समझने में अधिक कठिन बना दिया जाता है। आप _.some(list, [iterator], [context]) उपयोग कर सकते हैं http://jsfiddle.net/SMtX5/

+1

पीछे स्पष्टीकरण और तर्क के लिए thans। – bsr

2

:

कि कोड कार्रवाई में कतरना देखें।

यह रिटर्न सच अगर सूची में से कोई भी मान इटरेटर सच्चाई परीक्षा उत्तीर्ण।

var out = _.filter(aaa, function(val){ 
    return _.some(this,function(val2){ 
     return val2['id'] === val['id']; 
    }); 
}, bbb); 

यहां jsfiddle है। http://jsfiddle.net/h98ej/

+0

स्वीकार्य उत्तर के आधार पर, इस दिनचर्या बनाम बहुत तेज़ी से स्वीकार किया गया था? –

15

आप फ़िल्टर करना _.find उपयोग कर सकते हैं:

_.filter(aaa, function(a){ 
    return _.find(bbb, function(b){ 
     return b.id === a.id; 
    }); 
}); 
1
bbb = bbb.map(_ => _.id) && aaa.filter(_ => bbb.indexOf(_.id) > -1) 

आप सिर्फ शुद्ध जे एस सरणी कार्यों की जरूरत है ऐसा करने के लिए कि आपके उपयोग के मामले संभालने।