JS对象数组去重的常⽤⽅法
0. new Set 的不适⽤
项⽬中需要将⼀个对象数组去重,⼀般的数组去重可以直接⽤ new Set() ⽅法即可,但是对象数组的话,因为每⼀个元素都是引⽤类型⽐较复杂,使⽤new Set ⽆法进⾏去重,代码如下所⽰:
var arr1 = ["张三","李四","王五","张三"]
var arr2 = [{"id":1,"name":"张三"},{"id":2,"name":"李四"},{"id":1,"name":"王五"},{"id":1,"name":"张三"}];
console.log(new Set(arr1));
console.log(new Set(arr2));
结果如下:可以看出,new Set去重对于对象数组并不适⽤。
我们可以采取以下三种⽅法来去重对象数组
注:以下都是根据标识id属性进⾏去重
1. 常规for循环遍历
var arr = [{"id":1,"name":"张三"},{"id":2,"name":"李四"},{"id":3,"name":"王五"},{"id":1,"name":"张三"}];
var result = [];
var obj = {};
for(var i =0; i<arr.length; i++){
if(!obj[arr[i].id]){
result.push(arr[i]);
obj[arr[i].id] = true;
}
}
console.log(result);
2. new Map
var arr = [{"id":1,"name":"张三"},{"id":2,"name":"李四"},{"id":3,"name":"王五"},{"id":1,"name":"张三"}];
function unique(arr) {
// 创建⼀个Map对象实例
const res = new Map()
// 过滤条件:如果res中没有某个键,就设置这个键的值为1
return arr.filter((arr) => !res.has(arr.id) && res.set(arr.id, 1))
}
console.log(unique(arr));
注意:键值是多少不重要,主要是利⽤map结构去重,因为map中的key是唯⼀的。
3. reduce
/filter过滤对象数组
/reduce第⼀个参数是遍历需要执⾏的函数,第⼆个参数是item的初始值
var arr = [{"id":1,"name":"张三"},{"id":2,"name":"李四"},{"id":3,"name":"王五"},{"id":2,"name":"张三"}];
var obj = {};
arr = duce(function(item, next) {
obj[next.id] ? '' : obj[next.id] = true && item.push(next);
return item;
}, []);
console.log(arr);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论