数组去重是js中很常见的问题
这里总结了常用的一些去重算法(7种)
- 使用数组内置api splice() 原数组改变
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--;//删除后索引号发生改变,要j--才不会漏掉。
}
}
}
console.log(arr)
- indexOf()的使用,生成新数组
// 方法2
var res = [];
for(var i = 0;i<arr.length;i++){
if(res.indexOf(arr[i])===-1){
res.push(arr[i]);
}
};
console.log(res);
- 使用计数器或者flag的方式,生成的新数组
// 方法3
var res = [];
for (var i = 0; i < arr.length; i++) {
var count = 0;
for (var j = 0; j < res.length; j++ ) {
if (arr[i] == res[j]) {
count++;
break;
}
}
if (count ==0) {
res.push(arr[i]);
}
}
console.log(res);
var res = [];
var flag = false;
for (var i = 0; i < arr.length; i++) {
for (var j = 0; j < res.length; j++) {
if (arr[i] === res[j]) {
flag = true;
break
} else {
flag = false;
}
}
if (!flag) {
res.push(arr[i])
}
}
console.log(res);
- 使用filter()实现,生成的新数组
indexOf()会返回第一个出现的字符的索引 ,如果数组中有重复的那么后面的元素的执行indexof的返回值为前面相同元素的索引号,因此我们就可以通过filter筛选出indexOf返回的索引号与本身索引号相同的数组元素即可实现数组去重。
// 方法4
var res =arr.filter(function(item,index,array,thisArg){
return array.indexOf(item)==index;
})
console.log(res,arr);
- 利用sort()先排序(把同类的排到一起 不一定要按大小顺序排序)
//5
arr =arr.sort();
var newArr=[arr[0]];
for(var i = 0;i <arr.length; i++){
if(arr[i]!==arr[i-1]){
newArr.push(arr[i])
}
}
console.log(newArr);
- 如果新数组中存在与原数组[i]相等的元素,执行到if后break跳出上面的for循环因此j++ 不执行,此时j永远小于res.length(小1), 返回上一层循环,
- 如果新数组中不存在与原数组[i]相等的元素,j++执行,此时j++=res.length,不会继续执行该层循环,向下执行if(j === res.length),
然后push()添加元素 - 生成的新数组
//6
var res = [];
for (var i = 0; i < arr.length; i++) {
for (var j = 0; j < res.length; j++) {
if (arr[i] === res[j]) {
break;
}
}
if (j === res.length) {
res.push(arr[i]);
}
}
console.log (res);
- indexOf的返回值是否为-1,为-1则添加,生成的新数组
//7
var res = [];
for (var i = 0; i < arr.length; i++) {
res.indexOf(arr[i]) === -1 ? res.push(arr[i]) : '';
}
console.log (res);
console.log (res);