Underscore.js: findWhere с вложенным значением свойства
Как перейти к фильтрации ниже:
[{
"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/
Любое предложение очень ценится.
Ответы
Ответ 1
Вы можете использовать комбинацию _.filter
и _.where
_.filter(data, function(obj) {
return _.where(obj.tax, {id: ID_TO_FIND}).length > 0;
})
Смотрите демонстрацию: http://jsfiddle.net/hCVxp/
Update
Благодаря @GruffBunny. Более эффективным способом является использование _.some
, чтобы избежать прокрутки всех элементов tax
:
var arr = _.filter(data, function(obj) {
return _.some(obj.tax, {id: ID_TO_FIND});
});
Смотрите демонстрацию: http://jsbin.com/putefarade/1/edit?html,js,console
Ответ 2
Используйте _.filter, чтобы найти элементы-кандидаты и _.some, чтобы проверить наличие элемента в коллекции:
var filteredList = _.filter(list, function(item){
return _.some(item.tax, { id: 17 });
});
Ответ 3
Вы можете сделать это с помощью _.where.
var filteredList = _.where(list, { tax:[{id:17}] });
Изменить: этот метод работает в старой версии lodash, но не работает в текущем знаке подчеркивания или lodash.
Рабочий пример:
https://jsfiddle.net/rhp4crma/