Фильтр для элементов во вложенном массиве с использованием lodash - PullRequest
1 голос
/ 20 марта 2019

У меня есть массив из> 1000 объектов, каждый из которых имеет вложенный массив, который выглядит примерно так:

data = [{
  "id": 0,
  "location": "A",
  "basket": [
    "milk",
    "bread",
    "sugar",
    "water"
  ],
}, {
  "id": 1,
  "location": "B",
  "basket": [
    "chocolate",
    "cereal",
    "sugar",
    "sauce"
  ],
}, {
  "id": 2,
  "location": "C",
  "basket": [
    "milk",
    "cereal",
    "soda",
    "flour"
  ],
}]

У меня есть выпадающее меню с множественным выбором, в котором есть список всех элементов в "корзина "вложенный массив.Когда я выбираю «сахар», он должен иметь возможность возвращать объекты с id = 0 и id = 1, или если я выбираю «water» и «milk», должны возвращаться объекты с id = 0 и id = 2.Я пытался использовать комбинацию _.map _.find _.filter, но это не работает.Также пытался найти похожие вопросы здесь, но не нашел.предпочитайте использовать lodash, если это возможно.

1 Ответ

1 голос
/ 21 марта 2019

Вы можете использовать это:

var result = _.filter(data, { basket: ['sugar', 'milk'] });

Замените массив продуктов тем, что вы ищете.Все они должны находиться в одном и том же элементе, чтобы его можно было сохранить в результате.

Хотя вы четко указываете, что предпочитаете решение на основе lodash, я также хочу добавить ванильный JS-путь:

var filtered = data.filter(function(item){
    return ['sugar', 'milk'].every(product => item.basket.includes(product));
});

Если вы хотите, чтобы логика заключалась в том, что только некоторые из выбранных продуктов должны присутствовать в корзине, чтобы их можно было выбрать, то и в версии lodash вам потребуется обратный вызов:

var result = _.filter(data, function(item) {
    return _.intersection(item.basket, ['sugar', 'milk']).length;
});

В версии vanilla JS заменить every на some.

...