正常利用filter去重
var arr = [1, 2, 2, 3, 4, 5, 5, 6, 7, 7,8,8,0,8,6,3,4,56,2];
var arr2 = arr.filter((item, index,self)=>{
return self.indexOf(item)===index
})
console.log(arr2); // [1, 2, 3, 4, 5, 6, 7, 8, 0, 56]
此方法判断去重机制:在filter中定义了一个匿名函数,在filter方法中,会遍历目标数组,对于数组中的每个元素,都会被自己定义的那个匿名函数执行一次,每一次返回一个boolean值,如果返回false,则会将该元素从数组中去除,最后filter方法会返回一个新的数组对象作为处理结果。
这种方式的局限性:由于里面的判断相等,用的是indexOf(item)获取当前元素出现的第一次出现的位置,再判断该位置是否与当前元素下标相等,如果不相等,说明在其他位置出现的相同的值,就返回false,这种方式只能用于简单元素的数组,不能用于判断对象。
给对象去重
var arr = [
{'id':1,'name':'fsdf'},
{'id':1,'name':'fsdf'},
{'id':2,'name':'fsdf'},
{'id':2,'name':'fsdf'},
{'id':3,'name':'fsdf'},
];
var arr2 = arr.filter((x, index,self)=>{
var arrids = []
arr.forEach((item,i) => {
arrids.push(item.id)
})
return arrids.indexOf(x.id) === index
})
console.log(arr2);
实现原理:: 这个是去除有相同id的对象,首先将每个元素的id单独取出来,给放到一个新的数组中,然后再利用上面的方式进行判断去重 同样有缺陷:只能用于判断对象数组中的对象的某个属性是否重复
进一步的优化(某对象中要判断多个字段同时重复)
var arr = [
{'id':1,'name':'fsdfwsd',},
{'id':1,'name':'fsdfwsd',},
{'id':1,'name':'ythrg'},
{'id':2,'name':'trhwfre'},
{'id':2,'name':'lokfjks'},
{'id':2,'name':'trhwfre'},
{'id':3,'name':'trewtw'},
];
var arr2 = arr.filter((x, index,self)=>{
var arrids = []
var arrnames = []
arr.forEach((item,i) => {
arrids.push(item.id)
arrnames.push(item.name)
})
var judgeOne = arrids.indexOf(x.id) === index
var judgeTwo = arrnames.indexOf(x.name) === index
return judgeOne || judgeTwo
})
console.log(arr2);
实现方式:如果要判断多个对象中的字段,可以继续使用上面的方式,将要判断的其他字段加入同样存入数组中,最后对多个数组进行判断,最后只要有一个为false就为返回false