Javascript underline.js:findWhere具有嵌套属性值

Javascript underline.js:findWhere具有嵌套属性值,javascript,underscore.js,Javascript,Underscore.js,如何进行以下过滤: [{ "id": 100, "title": "Tlt1", "tax": [{ "name": "Tax1", "id": 15 }, { "name": "Tax1", "id": 17 }] }, { "id": 101, "title": "Tlt2", "tax": [{ "name": "Tax2", "i

如何进行以下过滤:

[{
    "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);
        }
    });
});
此处演示:


非常感谢您的任何建议

您可以结合使用
.filter
.where

_.filter(data, function(obj) {
    return _.where(obj.tax, {id: ID_TO_FIND}).length > 0;
})
请参见演示:

更新
多亏了@GruffBunny。一种更有效的方法是使用
一些
避免在所有
税务
项目中循环:

var arr = _.filter(data, function(obj) {
    return _.some(obj.tax, {id: ID_TO_FIND});
});

请参见演示:

使用u.filter查找候选项,使用u.some检查集合中是否存在项:

var filteredList = _.filter(list, function(item){
    return _.some(item.tax, { id: 17 });
});

你可以一个人在哪里做这件事

var filteredList  = _.where(list, { tax:[{id:17}] });
编辑:此方法适用于旧版本的lodash,但不适用于当前下划线或lodash。 工作示例:

第一次使用
下划线
,第一次路障,谷歌上的第一个链接,FTW!另外,如果tax只是一个对象,那么您必须将它放在一个数组中,以使其工作。类似这样的东西u.some([obj.tax],{id:id\u TO\u FIND});我认为这个答案比上面被接受的答案更有效。我可以在过滤器内使用u.find吗?有人能告诉我为什么这被否决了吗?我测试了它,它只返回了OP要求的一个命令的确切结果。我尝试了这个,但它不起作用。尽管项目存在,但Mine返回未定义的正确语法为:var filteredList=u389; where(list,{tax:{id:17});我已经投票支持您的答案,以鼓励您参与,因此,请更新您的答案,并使用指向此特定案例的JSFIDLE示例的链接,并按照@Sam建议更新您的答案更正器。这可能是CR的候选人。。。