推荐首用:? 送上一段在1000000个随机数测试,执行时长为9ms的代码,仅供参考
const arr = [1, 4, 5, 6, 7, 4, 6, 7, 6, 7, 8, 98, 5, 3, 2, 1, 0, 9];
const uniqueArr = Object.keys(
arr.reduce((pre, cur) => {
pre[cur] === undefined && (pre[cur] = true);
return pre;
}, {})
);
console.log(uniqueArr); //["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "98"];
数组去重,虽然是前端开发,但也至少关注下时间复杂度/空间复杂度。后面介绍的几个方法都是O(n^2)的方法。经过实测,在1000000个随机数测试的情况下,原生Set方法为21ms,后面三个方法都在1s以上,其中使用filter+indexOf的方法达到了2s
1、使用 Set:Set 是 ES6 引入的新数据结构,它只存储唯一值。通过将数组转换为 Set,然后再将其转回为数组,就能实现去重。
const arr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArr = [...new Set(arr)];
console.log(uniqueArr); // [1, 2, 3, 4, 5]
2、使用 filter:使用 Array 的 filter 方法,遍历数组并返回一个新数组,只包含满足指定条件的元素
const arr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArr = arr.filter((value, index, self) => {
return self.indexOf(value) === index;
});
console.log(uniqueArr); // [1, 2, 3, 4, 5]
3、使用 reduce:使用 Array 的 reduce 方法,遍历数组并根据指定条件添加元素到新数组中。
const arr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArr = arr.reduce((prev, current) => {
if (!prev.includes(current)) {
prev.push(current);
}
return prev;
}, []);
console.log(uniqueArr); // [1, 2, 3, 4, 5]
4、使用 includes 或 indexOf:使用 Array 的 includes 或 indexOf 方法,判断元素是否已经存在于数组中,若不存在则添加到新数组中。
const arr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArr = [];
arr.forEach((value) => {
if (!uniqueArr.includes(value)) {
uniqueArr.push(value);
}
});
console.log(uniqueArr); // [1, 2, 3, 4, 5]