高效率数组去重
这里我创健了一个15w并有5w重复数据的数组进行测试
var arr1 = Array.from(new Array(100000), (x, index)=>{
return index;
})
var arr2 = Array.from(new Array(50000), (x, index)=>{
return index + index;
})
var arr = arr1.concat(arr2);
方案一
双for循环进行比较,对相同的数据进行splice删除
console.time("label1");
function text1 () {
for(var i = 0 ; i < arr.length ; i++){
for(var j = i+1 ; j < arr.length ; j++){
if(arr[i] == arr[j]){
arr.splice(j,1);
j--;
}
}
}
console.log(arr);
}
text1(arr);
console.timeEnd("label1");
方案二
建立空数组储存未重复的数据,利用indexof的特性来完成去重
console.time("label2");
function text2 () {
var new_arr = [];
for(var i = 0 ; i < arr.length ; i++){
if(new_arr.indexOf(arr[i]) == -1 ){
new_arr.push(arr[i]);
}
}
console.log(new_arr);
}
text2(arr);
console.timeEnd("label2");
上面两种方案由于去重时比较次数过多,所以都效率都很低
而下面的方案较好,为了差距明显化,我提高了10倍的数据量
方案三
hash验证去重
console.time("label3");
function text3 (arr) {
console.log(arr);
for(var i = 0 ,new_arr = [] , hash = [] ; i < arr.length ; i++){
if(hash[arr[i]] === undefined){
hash[arr[i]] = true;
new_arr[new_arr.length] = arr[i];
}
}
console.log(new_arr);
}
text3(arr);
console.timeEnd("label3");
方案四
利用ES6新的数据结构set,它的成员都是唯一的,没有重复的值
console.time("label4");
function text4 () {
console.log(arr);
var new_arr = [...new Set(arr)];
console.log(new_arr);
}
text4(arr);
console.timeEnd("label4");