按 属性 过滤对象数组,使用字符串数组,使用字符串数组
Filter array of objects by property with array of strings with an array of strings
所以我有这样的数据:
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 时遇到的问题return没什么。
我期望 return 值是这样的:
[
{foo: ["0001|main|0002", "0001|main|0014", "0001|main|0016"]},
{foo: ["0001|main|0014", "0001|main|0018", "0001|main|0019"]},
]
I works fine when selection has only one string in it.我认为它正在搜索与选择中的两个字符串都匹配的项目。
如有任何帮助,我们将不胜感激!
既然你想要
["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)
所以我有这样的数据:
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 时遇到的问题return没什么。 我期望 return 值是这样的:
[
{foo: ["0001|main|0002", "0001|main|0014", "0001|main|0016"]},
{foo: ["0001|main|0014", "0001|main|0018", "0001|main|0019"]},
]
I works fine when selection has only one string in it.我认为它正在搜索与选择中的两个字符串都匹配的项目。
如有任何帮助,我们将不胜感激!
既然你想要
["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)