es6使⽤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((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'
},
filter过滤对象数组{
'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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论