代码之家  ›  专栏  ›  技术社区  ›  Alejandro Ozai

按属性筛选对象数组,使用字符串数组筛选字符串数组

  •  0
  • Alejandro Ozai  · 技术社区  · 2 年前

    所以我有如下数据:

        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"]},
    ]
    

    当选择中只有一个字符串时,我可以很好地工作。我认为它是在搜索与所选内容中的两个字符串都匹配的项目。

    任何帮助都将不胜感激!

    1 回复  |  直到 2 年前
        1
  •  2
  •   CertainPerformance    2 年前

    既然你想

    ["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);      
        2
  •  0
  •   RS9029    2 年前

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

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

    您必须首先遍历数据数组,然后遍历每个项。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)