Подтвердить что ты не робот

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/

Любое предложение очень ценится.

4b9b3361

Ответ 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/