欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

用filter方法去除对象数组的重复项

最编程 2024-02-02 08:24:49
...

正常利用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

原文链接:blog.****.net/juststartno…

推荐阅读