问题描述
我有一个对象数组,需要检查特定字段中是否包含第二个数组的任何值。
我的数组称为 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
)
);