一般的去重方式
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((x, index,self)=>{
// self:表示该数组对象
// x: 表示当前对象
// index: 表示当前元素下标
return self.indexOf(x)===index
})
console.log(arr2); //[1, 2, 3, 4, 5, 6, 7, 8, 0, 56]
此方法判断去重机制: 在filter中定义了一个匿名函数, 在filter方法中,会遍历目标数组,对于数组中的每个元素,都会被自己定义的那个匿名函数执行一次,每一次返回一个boolean值,如果返回false,则会将该元素从数组中去除.最后filter方法会返回一个新的数组对象作为处理结果.
这种方式的局限性: 由于里面的判断相等,用的是indexOf(x)—获取当前元素出现的第一次出现的位置,再判断该位置是否与当前元素下标相等,如果不相等,说明在其他位置出现的相同的值,就返回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