从 JavaScript 数组中删除重复值可能是一项常见任务,尤其是在处理可能包含冗余条目的数据时。有多种方法可以有效地实现此目的,具体取决于数据的性质和性能考虑因素。
此方法利用内置的 Set 构造函数和展开语法创建仅包含原始数组中唯一值的新数组的语法:
const uniq = [...new Set(array)];
此方法使用 filter() 方法迭代数组并检查每个元素的第一次出现是否与其在数组中的当前位置匹配。位置不匹配的元素被视为重复:
const uniqueArray = a.filter((item, pos) => a.indexOf(item) === pos);
哈希表提供了一种使用键值对检测重复元素的有效方法。在这种方法中,每个元素都被添加到哈希表中,并立即检查元素是否存在:
function uniq(a) { const seen = {}; return a.filter((item) => { return seen.hasOwnProperty(item) ? false : (seen[item] = true); }); }
结合前两个的优点方法,该解决方案利用哈希表作为原始值并线性搜索对象:
function uniq(a) { const prims = { boolean: {}, number: {}, string: {} }, objs = []; return a.filter((item) => { const type = typeof item; if (type in prims) return prims[type].hasOwnProperty(item) ? false : (prims[type][item] = true); else return objs.indexOf(item) >= 0 ? false : objs.push(item); }); }
在删除重复项之前对数组进行排序可以简化过程:
function uniq(a) { return a.sort().filter((item, pos, ary) => !pos || item != ary[pos - 1]); }
当您需要根据特定条件删除重复项时,例如对象的属性,可以向 uniqBy() 方法提供回调函数:
function uniqBy(a, key) { const seen = {}; return a.filter((item) => { const k = key(item); return seen.hasOwnProperty(k) ? false : (seen[k] = true); }); }
如果您只想保留第一次或最后一次出现的重复对象,可以使用 Set 或 Map 数据结构:
function uniqByKeepFirst(a, key) { const seen = new Set(); return a.filter((item) => { const k = key(item); return seen.has(k) ? false : seen.add(k); }); } function uniqByKeepLast(a, key) { return [...new Map(a.map((x) => [key(x), x])).values()]; }
以上是如何有效地从 JavaScript 数组中删除重复值?的详细内容。更多信息请关注PHP中文网其他相关文章!