关于JOSN数组去重

关于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},
      ]
  • 方法一
    (更方便的算法请看方法二)
    当知道想要什么样的数据时,那脑子里首先想到了先算出重复数据的个数,然后再去重:
  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

你可能感兴趣的:(js,JavaScript,json)