代码之家  ›  专栏  ›  技术社区  ›  user8463863

javascript过滤出数组中的子字符串元素

  •  0
  • user8463863  · 技术社区  · 6 年前

    有没有一种方法,理想地使用高阶函数,过滤出数组中重复的子字符串元素?例如:

    var obj = ["a", "a.b.c", "a.b", "a.e", "a.b.d"]
    

    成为

    ["a.b.c", "a.e", "a.b.d"] //since both "a" and "a.b" appear inside either "a.b.c" or "a.b.d".
    

    解决方案可能需要哈希表或集合,但我不确定如何开始。

    3 回复  |  直到 6 年前
        1
  •  2
  •   charlietfl    6 年前

    可以使用 filter() find() 与一组组合以删除重复项

    var data = ["a", "a.b.c", "a.b", "a.e", "a.b.d"];
    
    var res = [...new Set(data)].filter(val => !data.find(s => s !== val && s.startsWith(val)));
    
    console.log(res)
        2
  •  2
  •   CRice    6 年前

    你可以使用数组 .reduce 函数执行此操作。

    只需查看当前字符串是否是数组中已有内容的子字符串,如果是,则忽略它。否则,如果数组中的某个内容是当前字符串的子字符串,请将其替换。最后,如果两者都不是,则将当前字符串添加到数组中:

    var obj = ["a", "a.b.c", "a.b", "a.e", "a.b.d"]
    
    var result = obj.reduce((deduped, item) => {
      if (deduped.some(s => s.includes(item))) return deduped;
      
      const replace = deduped.findIndex(s => item.includes(s));
      if (replace !== -1) {
        deduped.splice(replace, 1, item)
      } else {
        deduped.push(item)
      }
      
      return deduped;
    }, []);
    
    console.log(result)
        3
  •  2
  •   Ele    6 年前

    另一种选择是使用函数 filter 要获得所需的元素,函数 some 检查至少一个匹配项和函数 includes 检查当前元素是否为子字符串。

    这种方法找到一个子字符串来标识匹配项。

    var obj = ["a", "a.b.c", "a.b", "a.e", "a.b.d"],
        filtered = obj.filter((element, i, arr) => !arr.some((o, oi) => {
          return oi === i ? false : o.includes(element);
        }));
    
    console.log(filtered);
    .as-console-wrapper { max-height: 100% !important; top: 0; }