繁体   English   中英

通过字符串数组和字符串数组的属性过滤对象数组

[英]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 时遇到的问题是什么都不返回。 我期望返回值是这样的:

[
 {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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM