我有一个正在尝试过滤的数组:
const elements = ['apple'];
const objects = [
{ id: 1, fruit:[{"name": "apple" },{"name": "banana" }]},
{ id: 2, fruit:[{"name": "apple" },{"name": "orange" }]},
{ id: 3, fruit:[{"name": "orange" },{"name": "banana" }]},
{ id: 4, fruit:[{"name": "orange" },{"name": "banana" }]}
];
const results = objects.filter(obj => obj.fruit.filter( ele => elements.includes(ele.name)));
console.log(results);
我得到的输出如下,但这不是我所期望的:
{id: 1, fruit:[{"name": "apple" },{"name": "banana" }]
{id: 2, fruit:[{"name": "apple" },{"name": "banana" }]
我想要如下输出:
{ id: 1, fruit:[{"name": "apple" }]}
{ id: 2, fruit:[{"name": "apple" }]}
因为空数组在 JavaScript 中是truthy。
考虑一下你在这里做什么:
objects.filter(obj => obj.fruit.filter(/*...*/))
对
filter()
的回调返回 true 或 false 值,具体取决于该元素是否应该包含在结果中。 但在这种情况下,每个元素都包含在结果中,因为即使内部.filter()
找不到匹配项,它仍然会返回一个空数组,这是一个“true”值。
不要只返回一个空数组,而是返回无论是否数组为空。 例如:
objects.filter(obj => obj.fruit.filter(/*...*/).length > 0)
将其应用到您的代码中:
const elements = ['apple'];
const objects = [
{ id: 1, fruit:[{"name": "apple" },{"name": "banana" }]},
{ id: 2, fruit:[{"name": "apple" },{"name": "orange" }]},
{ id: 3, fruit:[{"name": "orange" },{"name": "banana" }]},
{ id: 4, fruit:[{"name": "orange" },{"name": "banana" }]}
];
const results = objects.filter(obj =>
obj.fruit.filter(ele =>
elements.includes(ele.name)
).length > 0
);
console.log(results);