Javascript筛选出数组中的子字符串元素

时间:2018-07-18 19:16:12

标签: javascript

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

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 个答案:

答案 0 :(得分:2)

您可以使用数组.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)

答案 1 :(得分:2)

一种替代方法是使用函数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; }

答案 2 :(得分:2)

可以结合使用filter()find()以及Set来删除重复项

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)