按具有字符串数组的属性筛选对象数组



所以我有这样的数据:

const data = [
{ foo: ["0001|main|0002", "0001|main|0014", "0001|main|0016"] },
{ foo: ["0001|main|0014", "0001|main|0018", "0001|main|0019"] },
{ foo: []},
{ foo: ["0001|main|0001", "0001|main|0012", "0001|main|0022"] },
];

我需要用一个字符串数组来过滤它,它看起来像这样:

let selections = ["0014", "0016"];

我只需要为数据中的数字匹配具有相同末尾的项目,我目前有这样一种作品:

data.filter((item) => {
if(!item.foo.length) return false;
return selections.every((id) => item.foo.split('|')[2] === id)
});

我遇到的问题是,当选择上面这样的两个ID时,它不会返回任何结果。我原以为返回值是这样的:

[
{foo: ["0001|main|0002", "0001|main|0014", "0001|main|0016"]},
{foo: ["0001|main|0014", "0001|main|0018", "0001|main|0019"]},
]

当选择中只有一个字符串时,我工作得很好。我认为这是在搜索与选择中的两个字符串匹配的项目。

任何帮助都将不胜感激!

因为您想要

["0001|main|0014", "0001|main|0018", "0001|main|0019"]

要包括在内,听起来您需要至少一个的选择进行匹配,而不是每个选择都进行匹配。因此,请使用.some而不是.every

const data = [
{ foo: ["0001|main|0002", "0001|main|0014", "0001|main|0016"] },
{ foo: ["0001|main|0014", "0001|main|0018", "0001|main|0019"] },
{ foo: []},
{ foo: ["0001|main|0001", "0001|main|0012", "0001|main|0022"] },
];
const selections = ["0014", "0016"];
const result = data.filter(
({ foo }) => selections.some(
sel => foo.some(
str => str.endsWith(sel)
)
)
);
console.log(result);

当前解决方案的问题是您试图在数组上使用split()方法,而split方法适用于字符串。

我相信可能有更干净的方法来解决这个问题,但以下是我很快想到的。

您必须首先遍历数据数组,然后遍历item.foo的每个子元素。然后,这允许您运行类似于您正在做的检查,只是作为一个三元操作,它将把所有需要的项推送到一个伪数组,然后可以作为结果返回。

const data = [{
foo: ["0001|main|0002", "0001|main|0014", "0001|main|0016"]
},
{
foo: ["0001|main|0014", "0001|main|0018", "0001|main|0019"]
},
{
foo: []
},
{
foo: ["0001|main|0001", "0001|main|0012", "0001|main|0022"]
},
];
let selections = ["0014", "0016"];

const filteredItems = [];
data.forEach((item) => {
item.foo.forEach(fooItem => {
if (!fooItem.length) return false;
selections.every((id) => fooItem.split('|')[2] === id ? filteredItems.push(item.foo) : false);
})
});

console.log(filteredItems)

最新更新