如何检查一个数组是否包含另一个数组的任何值

问题描述

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

我的数组称为 cocktailList ,我需要检查的字段称为“ 成分”。

第二个数组称为 selectedOptions

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

示例

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

当我在 selectedOptions 中具有多个值时,就会出现问题 我的目标是如果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",}

解决方法

您可以进行简单的双循环...

function test() {
  let cocktailListc = [{
      "ingredients": "Tequila,Lime Juice,Agave Nectar Juice,Russian Vodka"
    },{
      "ingredients": "water test"
    },{
      "ingredients": "soda test"
    },{
      "ingredients": "rum test"
    },{
      "ingredients": "orange test"
    }
  ]

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

  let check = [];

  selectedOptions.forEach(opt => {
    cocktailListc.forEach(cocktail => {
      if (cocktail.ingredients.toLowerCase().includes(opt.toLowerCase()) === true) {
        check.push(cocktail);
      }
    });
  });

  if (check.length > 0) {
    console.log(true)
     console.log(check)
  }
}
test()

,

您可以使用some

来自@ikik的借阅片段:

let cocktailListc = [{
    "ingredients": "vodka"
  },{
    "ingredients": "water"
  },{
    "ingredients": "soda"
  },{
    "ingredients": "rum"
  },{
    "ingredients": "orange"
  }
]
const selectedOptions = ["vodka","limun"];

console.log(cocktailListc.some(item => selectedOptions.includes(item.ingredients)))

但是会在以下时间失败

let cocktailListc = [{
    "ingredients": "vodka"
  },{
    "ingredients": "orange"
  }
]
const selectedOptions = ["a","b","c"];

console.log(cocktailListc.some(item => selectedOptions.includes(item.ingredients)))

,

您可以这样做:

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
  )
);