2013-10-21 69 views
29

我正在尝试使用Underscore.js搜索对象数组,但似乎无法定位到我想要的目标。从包含特定值的数组中获取对象

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数组中的第二个对象,是有可能用它来下划线得到?而不是findWhere

回答

49

使用_.find

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

它们是相似的,但findWhere是专为要匹配的键值对(在您的情况没有什么用处,因为它涉及到嵌套对象)的特殊情况。 Find更通用,因为它可以让你提供一个函数作为谓词。

+0

使用过滤器将使用替代在这种情况下'_.where'。他应该使用'_.find'而不是'_.filter'。 – 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); 
}; 

正如你所看到的,它会执行严格的平等,而不是深平等。如果你想有一个深刻的搜索过程中,这就够了(未经检验,未优化):

_.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 } }); 
相关问题