首页 > 解决方案 > 如何检查一个数组是否包含另一个数组的任何值

问题描述

我有一个对象数组,需要检查第二个数组的任何值是否包含在特定字段中。

我的数组称为鸡尾酒列表,我需要检查的字段称为“成分”。

第二个数组称为selectedOptions

当第二个数组只有 1 个值时,以下代码可以完美运行。

例子

const selectedOptions = ["vodka"];
const selectedDrinks = cocktailList.filter(function (item, i) {
      if (item.ingredients.toLowerCase().includes(selectedOptions)) {
        return true;
      } else false;
    });

当我在selectedOptions中有超过 1 个值时会出现问题 我的目标是如果 item.ingredients 包含 selectedOptions 的任何值,则返回 TRUE。

如果我有以下情况:

const selectedOptions = ["vodka", "rum"];

只有当成分字段包含selectedOptions的所有值时,它才会返回 true

我已经按照其他人的建议尝试了以下解决方案

if (item.ingredients.toLowerCase().some((val) => selectedOptions.indexOf(val) !== -1))

但我遇到了一个错误

TypeError: item.ingredients.toLowerCase().some is not a function. (In 'item.ingredients.toLowerCase().some(function (i)

每个项目都是一个对象,其中包含包含此类字符串的“成分”字段

 Object {
    "alcoholic": "true",
    "complete": false,
    "country": "cuba",
    "dairy_free": "",
    "description": "Made without the traditional orange liqueur",
    "difficulty": "",
    "dosage": "1½ shot(s) Tequila, ½ shot(s) Lime Juice, ½ shot(s)",
    "drinkId": "1103",
    "equipment": "Shaker, Strainer",
    "garnish": "",
    "glass": "collins",
    "ingredients": "Tequila, Lime Juice, Agave Nectar Juice",
}

标签: javascriptarraysprototypearray.prototype.map

解决方案


你可以这样做:

var selectedOptions = ["vodka"];
var cocktailList = [{ ingredients: "vodka, lemon, sugar" }];

var selectedDrinks = cocktailList.filter((cocktail, i) =>
  selectedOptions.reduce(
    (has, option) => has && cocktail.ingredients.includes(option),
    true
  )
);

推荐阅读