工作中遇到的一个问题,就是去除数组中重复的元素,记录一下几种有效的方法:
第一种思路:遍历要删除的数组arr, 把元素分别放入另一个数组tmp中,在判断该元素在arr中不存在才允许放入tmp中。
去除数组重复项var color = ['red','blue','green','pink','yellow','blue','black','red'];functionunique(arr){//遍历arr,把元素分别放入tmp数组(不存在才放)
var tmp = newArray();for(var i inarr){//该元素在tmp内部不存在才允许追加
if(tmp.indexOf(arr[i])==-1){
tmp.push(arr[i]);
}
}returntmp;
}var arr =unique(color);
console.log(arr);
第二种思路是:把目标数组arr的元素值和键的位置调换 自动就把重复的元素给删除掉了,调换后的样子:array('red'=>1,'blue'=>1,'green'=>1,'pink'=>1,'yellow'=>1,'black'=>1)
去除数组重复项var color = ['red','blue','green','pink','yellow','blue','black','red'];functionunique(arr){var tmp = newArray();for(var m inarr){
tmp[arr[m]]=1;
}//再把键和值的位置再次调换
console.log(tmp);var tmparr = newArray();for(var n intmp){
tmparr.push(n);
}returntmparr;
}var arr =unique(color);
console.log(arr);
第三种思路:我们可以 用一个hashtable的结构记录已有的元素,这样就可以避免内层循环。
去除数组重复项var color = ['red','blue','green','pink','yellow','blue','black','red'];functionunique(arr) {var result = [], hash ={};for (var i = 0, elem; (elem = arr[i]) != null; i++) {if (!hash[elem]) {
result.push(elem);
hash[elem]= true;
}
}returnresult;
}var arr =unique(color);
console.log(arr);
----------------------------------------------------------------------------------------------------补充----------------------------------------------------------------------------------------------------
第四种思路:使用ES6数组的reduce方法,封装了一个函数(推荐)
/**
* 数组去重
* @param {*} arr 接收的原数组
* @param {*} key 如果是对象数组[{id: 1}, {id: 2}, {id: 3}],则需要以什么key作为重复的标准,普通数组[1,2,3,2]不需要*/exportfunctionarrUnique(arr, key) {
let returnArr=[];if(key) {//对象数组去重
const obj ={};
returnArr= arr.reduce((cur, next) =>{
obj[next[key]]? '' : obj[next[key]] = true &&cur.push(next);returncur;
}, []);returnreturnArr;
}//普通数组去重
returnArr = arr.reduce((cur, next) =>{!cur.includes(next) &&cur.push(next);returncur;
}, []);returnreturnArr;
}