我如何进行以下过滤:
[{
"id": 100,
"title": "Tlt1",
"tax": [{
"name": "Tax1",
"id": 15
}, {
"name": "Tax1",
"id": 17
}]
}, {
"id": 101,
"title": "Tlt2",
"tax": [{
"name": "Tax2",
"id": 16
}]
}, {
"id": 102,
"title": "Tlt3",
"tax": [{
"name": "Tax3",
"id": 17
}, {
"name": "Tax3",
"id": 18
}]
}]
仅获取tax.id
为17
的那些,如下所示:
[
{
"id": 100,
"title": "Tlt1",
"tax": [
{
"name": "Tax1",
"id": 15
},
{
"name": "Tax1",
"id": 17
}
]
},
{
"id": 102,
"title": "Tlt3",
"tax": [
{
"name": "Tax3",
"id": 17
},
{
"name": "Tax3",
"id": 18
}
]
}
]
目前我使用下面的方法,但也许有更简洁的方法来解决这个问题?
var arr = [];
_(data).each(function (v1, k1) {
_(v1.tax).each(function (v2, k2) {
if (v2.id == id) {
arr.push(v1);
}
});
});
在这里演示:http://jsfiddle.net/7gcCz/2/
任何建议都非常感谢。
答案 0 :(得分:46)
您可以使用_.filter
和_.where
_.filter(data, function(obj) {
return _.where(obj.tax, {id: ID_TO_FIND}).length > 0;
})
请参阅演示:http://jsfiddle.net/hCVxp/
感谢@GruffBunny。更有效的方法是使用_.some
来避免遍历所有tax
项:
var arr = _.filter(data, function(obj) {
return _.some(obj.tax, {id: ID_TO_FIND});
});
答案 1 :(得分:19)
使用_.filter查找候选项目,使用_.some检查集合中是否存在项目:
var filteredList = _.filter(list, function(item){
return _.some(item.tax, { id: 17 });
});
答案 2 :(得分:3)
您可以单独使用_.where执行此操作。
var filteredList = _.where(list, { tax:[{id:17}] });
编辑:此方法适用于旧版本的lodash,但不适用于当前的下划线或lodash。 无论如何,工作示例: https://jsfiddle.net/rhp4crma/