[英]Javascript filter out substring elements in an array
有沒有一種方法,理想情況下使用高階函數來過濾出數組中重復的子字符串元素? 例如:
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".
該解決方案可能需要哈希表或集,但是我不確定如何開始。
您可以使用array .reduce
函數執行此操作。
只要看看您當前的字符串是否是數組中已經存在的子字符串,就可以忽略它。 否則,如果數組中的某些內容是當前字符串的子字符串,請替換它。 最后,如果不是這樣,則將當前字符串添加到數組中:
var obj = ["a", "abc", "ab", "ae", "abd"] 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)
一個替代方案是使用函數filter
,以獲得所需的元件,功能some
檢查至少一個匹配和功能includes
,以檢查是否當前元素是子串。
此方法找到一個子字符串來標識匹配項。
var obj = ["a", "abc", "ab", "ae", "abd"], 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; }
可以使用filter()
和find()
組合以及Set來刪除重復項
var data = ["a", "abc", "ab", "ae", "abd"]; var res = [...new Set(data)].filter(val => !data.find(s => s !== val && s.startsWith(val))); console.log(res)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.