关于JOSN数组去重
- 需求
将一个json数组去掉重复的数据并且得到重复数据的个数,如以下数据:
let a =[
{id:1001,name:"张三"},
{id:1001,name:"张三"},
{id:1002,name:"李四"},
]
想得到这样的数据:
let a =[
{id:1001,name:"张三",num:2},
{id:1002,name:"李四",num:1},
]
- 方法一
(更方便的算法请看方法二)
当知道想要什么样的数据时,那脑子里首先想到了先算出重复数据的个数,然后再去重:
-
a.map(res=>{ res.num =0 a.map(res1=>{ if(res.id === res1.id){ res.num++ } })
得出的结果如下:
2.去重,我想的是创建一个新数据用来存放去重后的数据
let newArr=[]
a.map((res,index)=>{
if (newArr.map(res1=>res1.id).indexOf(res.id) == -1) {
newArr.push(res)
}
})
输出newArr的结果如下图:
到这里就得到了想要的数据了,但是这种方法性能并不好,所以研究了另外一种方法
- 方法二
思路是创建一个新对象newObj,把根据判重的那个标志(根据id判断重复)作为key ,唯一标志所对应的数据作为value ;存在则改变num数量,不存在新增一条数据
let a =[
{id:1001,name:"张三"},
{id:1001,name:"张三"},
{id:1002,name:"李四"},
]
let newObj={}
a.map(item=>{
if(newObj[item.id]){
newObj[item.id].num++
}else{
item.num =1
newObj[item.id]=item
}
})
// 把得到的数据 values就得到了最终的数据
console.log(Object.values(newObj))
以上两种方法我肯定更倾向于第二种;
另外如果只是去重
let a =[
{id:1001,name:"张三"},
{id:1001,name:"张三"},
{id:1002,name:"李四"},
]
let newObj={}
a.map(item=>{
if(!newObj[item.id]){
newObj[item.id]=item
}
})
console.log(Object.values(newObj))
结果
- 结束语
欢迎有兴趣的朋友可以一起探讨更好的方法,有不正确的地方还望大佬指正~感激不尽
*本文属原创,转载还望请注明出处 *叫我鲁顺超吖 https://blog.csdn.net/jiaowolushunchao/article/details/107295804