js性能最好的两种数组去重方式,第一种为ES6的new Set()方式。
let arr = [1, 2, 2, 3];
let set = new Set(arr);
let newArr = Array.from(set);
console.log(newArr); // [1, 2, 3]
new Set之后的数据之后,为一个set结构的类数组数据。
需要同样使用ES6的Array.from方法转换成真实数组。
但是这种方法,无法处理数组中的对象重复问题,例如这样的数据:
let person = [
{id: 0, name: "小明"},
{id: 1, name: "小张"},
{id: 2, name: "小李"},
{id: 3, name: "小孙"},
{id: 1, name: "小周"},
{id: 2, name: "小陈"},
];
这时需要使用ES5的reduce方法实现数组去重。
arr.reduce(function(prev,cur,index,arr){
...
}, init);
arr 表示原数组;
prev 表示上一次调用回调时的返回值,或者初始值 init;
cur 表示当前正在处理的数组元素;
index 表示当前正在处理的数组元素的索引,若提供 init 值,则索引为0,否则索引为1;
init 表示初始值。
最终实现方法如下:
let person = [
{id: 0, name: "小明"},
{id: 1, name: "小张"},
{id: 2, name: "小李"},
{id: 3, name: "小孙"},
{id: 1, name: "小周"},
{id: 2, name: "小陈"},
];
let obj = {};
person = person.reduce((prev,cur) => {
if(obj[cur.id] == undefined){
obj[cur.id] = true && prev.push(cur);
}
return prev;
},[])
console.log(person);
初始化一个空数组,此时prev的值便为[],去上面声明的空对象obj中查找是否存在当前元素cur的id,当然是不存在的。之后便设置obj检查。
并且向计算对象中push当前对象cur。最后返回。