1

我有一个 > 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 的对象,或者如果我同时选择“水”和“牛奶”,则应该返回 id=0 和 id=2 的对象。我尝试过使用 _.map _.find _.filter 的组合,但它不起作用。也尝试在这里寻找类似的问题,但没有找到。如果可能,更喜欢使用 lodash。

4

1 回答 1

1

你可以使用这个:

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

用您正在寻找的任何产品替换一系列产品。它们必须全部出现在同一个项目中,才能保留在结果中。

尽管您清楚地表明您更喜欢基于 lodash 的解决方案,但我也想添加 vanilla 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;
});

在香草 JS 版本中,替换everysome.

于 2019-03-20T21:03:12.920 回答