Underscore.js : findWhere with nested property value

javascript, underscore.js

Solution

You may use the combination of `_.filter` and `_.where`

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

See demo: http://jsfiddle.net/hCVxp/

Update

Thanks to @GruffBunny. A more efficient way is to use `_.some` to avoid looping through all `tax` items:

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

See demo: http://jsbin.com/putefarade/1/edit?html,js,console

Problem

How do I go about the filtering below: ``` [{ "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 }] }] ``` to get only those where `tax.id` is `17`, as per below: ``` [ { "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 } ] } ] ``` Currently I use the method below, but maybe there is more clean way of going about this? ``` var arr = []; _(data).each(function (v1, k1) { _(v1.tax).each(function (v2, k2) { if (v2.id == id) { arr.push(v1); } }); }); ``` Demo here: http://jsfiddle.net/7gcCz/2/ Any suggestion much appreciated.

Original source