2013-10-21 9 views
29

है, मैं अंडरस्कोर.जेएस का उपयोग करके ऑब्जेक्ट्स की एक सरणी के माध्यम से खोज करने की कोशिश कर रहा हूं, लेकिन मैं इच्छित एक को लक्षित नहीं कर सकता।सरणी से ऑब्जेक्ट प्राप्त करें जिसमें एक विशिष्ट मान

console.log(_.findWhere(response.data, { TaskCategory: { TaskCategoryId: $routeParams.TaskCategory } })); 

हालांकि, इस undefined $routeParams.TaskCategory लौटा रहा है यह सरणी मैं तलाश कर रहा हूँ अंदर वस्तुओं का एक उदाहरण है 301

के बराबर है। इस डेटा data.response

[{ 
    "TaskCategory": { 
     "TaskCategoryId": 201, 
     "TaskName": "TaskName" 
    }, 
    "TaskCount": 1, 
    "Tasks": [{ 
     "EventTypeId": 201, 
     "EventName": "Event Driver", 
     "EventDate": "0001-01-01T00:00:00", 
     "EventId": "00000000-0000-0000-0000-000000000000", 
    }] 
}, 
{ 
    "TaskCategory": { 
     "TaskCategoryId": 301, 
     "TaskName": "TaskName" 
    }, 
    "TaskCount": 1, 
    "Tasks": [{ 
     "EventTypeId": 201, 
     "EventName": "Event Driver", 
     "EventDate": "0001-01-01T00:00:00", 
     "EventId": "00000000-0000-0000-0000-000000000000", 
    }] 
}] 

तो द्वारा प्रतिनिधित्व किया है मुझे लगता है कि सरणी TaskCategory.TaskCategoryId का उपयोग करने में दूसरी वस्तु चाहते हैं, यह इसके अंडरस्कोर का उपयोग कर पाने के लिए संभव है?

उत्तर

49

उपयोग _.find findWhere के बजाय:

console.log(_.find(response.data, function(item) { 
    return item.TaskCategory.TaskCategoryId == $routeParams.TaskCategory; 
})); 

वे समान हैं, लेकिन findWhere विशेष मामलों जहां कुंजी-मान जोड़ों मिलान करना चाहते हैं (अपने परिदृश्य में उपयोगी नहीं के रूप में यह नेस्टेड वस्तुओं शामिल है) के लिए बनाया गया है। Find अधिक सामान्य उपयोग है, क्योंकि यह आपको भविष्यवाणी के रूप में कार्य प्रदान करने देता है।

+0

फिल्टर का उपयोग का उपयोग कर के लिए एक स्थानापन्न होगा इस मामले में '_.where'। उसे '_.filter' की बजाय' _.find' का उपयोग करना चाहिए। – forivall

+0

@forivall ओह, ज़ाहिर है ... धन्यवाद। फ़िल्टर पूरे संग्रह को खोजेगा, जबकि पहले मैच में स्टॉप पाएं। मैंने अपडेट किया है – McGarnagle

+0

धन्यवाद दोस्तों, '_.find' सही काम किया। मुझे वास्तव में इस पुस्तकालय के साथ बैठने और सप्ताहांत में सीखने की जरूरत है। – Neil

6

_.findWhere/_.where के स्रोत के रूप

_.where = function(obj, attrs, first) { 
    if (_.isEmpty(attrs)) return first ? void 0 : []; 
    return _[first ? 'find' : 'filter'](obj, function(value) { 
    for (var key in attrs) { 
     if (attrs[key] !== value[key]) return false; 
    } 
    return true; 
    }); 
}; 

_.findWhere = function(obj, attrs) { 
    return _.where(obj, attrs, true); 
}; 

इस प्रकार आप देख सकते हैं यह गहरी समानता के बजाय सख्त समानता प्रदर्शन करती है। आप एक गहरी खोज चाहते हैं जहां, इस पर्याप्त होगा (अपरीक्षित, unoptimized):

_.whereDeep = function(obj, attrs, first) { 
    if (_.isEmpty(attrs)) return first ? void 0 : []; 
    return _[first ? 'find' : 'filter'](obj, function(value) { 
    for (var key in attrs) { 
     if (attrs[key] !== value[key] || !(_.isObject(attrs[key]) && _.whereDeep([value[key]], attrs[key], true))) return false; 
    } 
    return true; 
    }); 
}; 

_.findWhereDeep = function(obj, attrs) { 
    return _.whereDeep(obj, attrs, true); 
}; 

और तुम लगभग अपरिवर्तित, अपने कोड का उपयोग करने में सक्षम होगा

_.findWhereDeep(response.data, { TaskCategory: { TaskCategoryId: $routeParams.TaskCategory } }); 
संबंधित मुद्दे