数组去重方法
- es6的set方法(推荐)
- 双层循环
1.es6的set方法
let arr=[1, 2, 2, 3, 4, 3, 5]
let set6 = new Set(arr)
console.log('去重后的数组为:', set6)
输出的结果为一个set对象.
set{1,2,3,4,5}
特别注意!!!不是说使用了 new Set()就生成了去重后的数组,还需要解构这一步
const lastArr=[...set6]
//lastArr就是[1,2,3,4,5]
2.双层循环
如果有相同的值则跳过,不相同则push进数组
Array.prototype.distinct = function(){
var arr = this,
result = [],
i,
j,
len = arr.length;
for(i = 0; i < len; i++){
for(j = i + 1; j < len; j++){
if(arr[i] === arr[j]){
j = ++i;
}
}
result.push(arr[i]);
}
return result;
}
var arra = [1,2,3,4,4,1,1,2,1,1,1];
arra.distinct(); //返回[3,4,2,1]
3.利用splice直接在原数组进行操作
双层循环,外层循环元素,内层循环时比较值
值相同时,则删去这个值
注意点:删除元素之后,需要将数组的长度也减1.
rray.prototype.distinct = function (){
var arr = this,
i,
j,
len = arr.length;
for(i = 0; i < len; i++){
for(j = i + 1; j < len; j++){
if(arr[i] == arr[j]){
arr.splice(j,1);
len--;
j--;
}
}
}
return arr;
};
var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,];
var b = a.distinct();
console.log(b.toString()); //1,2,3,4,5,6,56
4.利用indexOf以及forEach
Array.prototype.distinct = function (){
var arr = this,
result = [],
len = arr.length;
arr.forEach(function(v, i ,arr){ //这里利用map,filter方法也可以实现
var bool = arr.indexOf(v,i+1); //从传入参数的下一个索引值开始寻找是否存在重复
if(bool === -1){
result.push(v);
}
})
return result;
};
var a = [1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,3,2,3,3,2,2,1,23,1,23,2,3,2,3,2,3];
var b = a.distinct();
console.log(b.toString()); //1,23,2,3
补充:forEach(),map(),filter(),find()区别
foreach()
forEach只是简单的将数组遍历,类似于军人接受检阅,但是检阅结束并不会返回任何东西,也不会改变原数组,forEach的返回永远是undefind
let total = null
let arr = [1,2,3]
let result = arr.forEach(a => {
total += a
return a + 1
})
console.log(result) //undefind
console.log(total) //6
console.log(arr) //[1,2,3]
map()
map可以比喻成去超市买东西,你拿了一个物品清单,然后服务员帮你拿好东西,返回给你一个物品的新数组,但是对清单原数组不发生改变
let goodsList = ['apple','pear','orange']
let goods = goodList.map(good => {
return superMarket.getGoods(good)
})
console.log(goodsList) //['apple','pear','orange']
console.log(goods) //三个物品对象
filter()
filter()就是让男生排队身高高于180的就归入到新数组中,最后返回一个里面装着所有180+的男生的数组,不改变原数组
let highBoys = boys.filter((boy/数组当前遍历到的元素/)=> {
return boy.highy >= 180
}
console.log(highBoys) // [boy,boy,....]
find()
find()函数就是你去找人想找一个180的男生帮你去搬砖,只要找到第一个就停止遍历,因为只要找一个,为了减少无用的操作,虽然其他方法也能实现同样的要过,但是最好用find()
var ages = [3, 10, 18, 20];
let ageres= ages.find((age)=>
age >= 10
)
console.log(ageres)