JavaScript数组去重方法
1. 使用Set和展开运算符(最简洁方法)
const uniq = [...new Set(array)];
2. 使用filter方法
const uniqueArray = a.filter((item, pos) => a.indexOf(item) === pos);
3. 使用哈希表(对于大型数组更高效)
function uniq(a) {
const seen = {};
return a.filter(item => seen.hasOwnProperty(item) ? false : (seen[item] = true));
}
4. 结合哈希表和线性搜索(适用于混合类型数组)
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);
});
}
5. 排序后去重(不适用于对象)
function uniq(a) {
return a.sort().filter((item, pos, ary) => !pos || item != ary[pos - 1]);
}
6. ES6方法
const uniq = a => [...new Set(a)];
注意事项
- Set方法简洁高效,但仅适用于ES6及以上版本。
- filter方法简单易懂,但对大型数组效率较低。
- 哈希表方法效率高,但可能无法区分数字和数字字符串。
- 结合哈希表和线性搜索的方法更通用,但相对复杂。
- 排序方法可能会改变原数组顺序。