javascript数组中Filter的过滤器

问题描述 投票:0回答:1

我有一个正在尝试过滤的数组:

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 arrays
1个回答
0
投票

因为空数组在 JavaScript 中是truthy

考虑一下你在这里做什么:

objects.filter(obj => obj.fruit.filter(/*...*/))

filter()
的回调返回 truefalse 值,具体取决于该元素是否应该包含在结果中。 但在这种情况下,每个元素都包含在结果中,因为即使内部
.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);

© www.soinside.com 2019 - 2024. All rights reserved.