我有一个对象数组,我想根据另一个数组对其进行筛选。如果filters
对象值只有一个,我只能使用filter
,但如果filters
对象中有一个以上的值,则不会显示任何内容。因此,在过滤器中使用forEach
,并希望返回拟合值。你能帮我解决一下问题吗?感谢
预期结果:
[
{
"tags": [
"madewithout__gluten",
"madewithout__nuts",
],
"metafields": "Side"
}
]
const data = [
{
"tags": [
"madewithout__gluten",
"madewithout__nuts",
],
"metafields": "Side"
},
{
"tags": [
"madewithout__gluten",
],
"metafields": "Side"
},
{
"tags": [
"madewithout__nuts"
],
"metafields": "Side"
}
]
const filters = ['gluten', 'nuts']
const result = data.filter((v) => {
filters.forEach((tag) => {
if(!v.tags.includes(`madewithout__${tag}`))
return;
});
});
console.log(result);
根据您提供的数据的语义,您需要检查tags
:中是否包含所有filters
const result = data.filter((v) =>
filters.every((tag) => v.tags.includes(`madewithout__${tag}`))
)
const data = [
{
"tags": [
"madewithout__gluten",
"madewithout__nuts",
],
"metafields": "Side"
},
{
"tags": [
"madewithout__gluten",
],
"metafields": "Side"
},
{
"tags": [
"madewithout__nuts"
],
"metafields": "Side"
}
]
const filters = ['gluten', 'nuts']
const result = data.filter((v) =>
filters.every((tag) => v.tags.includes(`madewithout__${tag}`))
)
console.log(result);
使用.some
而不是.forEach
const result = data.filter((v) => {
return !filters.some((tag) => !v.tags.includes(`madewithout__${tag}`))
});
const data = [{
"tags": [
"madewithout__gluten",
"madewithout__nuts",
],
"metafields": "Side"
},
{
"tags": [
"madewithout__gluten",
],
"metafields": "Side"
},
{
"tags": [
"madewithout__nuts"
],
"metafields": "Side"
}
]
const filters = ['gluten', 'nuts']
const result = data.filter((v) => {
return !filters.some((tag) => !v.tags.includes(`madewithout__${tag}`))
});
console.log(result);
代码问题
Array.forEach
不返回任何内容。所以您的返回不会破坏循环或返回值- 您的
Array.filter
没有return
语句。因此,默认情况下,所有内容都是falsy(返回undefined(,因此数组为空