如何根据key合并数组中的对象

  • A+
所属分类:Web前端
摘要

原文地址项目中经常会遇到,array内包含object这个格式的json 需要我们根据一个key去合并其中的对象,一般是 id
效率最低的方法是 循环套循环,找到一致id的,然后添加到其中一个array内
比较好的方法 是把这个id对应的object 暂存一个obj内,比如 obj[item.id] = {…item,…item2}
最后根据 Object.values() 方法 重新转化为数组

原文地址

如何根据key合并数组中的对象(已同步到npm lm-public-js 中)

项目中经常会遇到,array内包含object这个格式的json 需要我们根据一个key去合并其中的对象,一般是 id
效率最低的方法是 循环套循环,找到一致id的,然后添加到其中一个array内
比较好的方法 是把这个id对应的object 暂存一个obj内,比如 obj[item.id] = {...item,...item2}
最后根据 Object.values() 方法 重新转化为数组

    function mergeArrAndObj(data1 = [],data2 = [],key){         if(!(data1 instanceof Array || data1 instanceof Object)) return console.warn('第一个参数格式不对')         if(!(data2 instanceof Array || data2 instanceof Object)) return console.warn('第二个参数格式不对')         if(!((data1 instanceof Array && data2 instanceof Array) || (data1 instanceof Object && data2 instanceof Object))) return console.warn('数据类型不一致')                  //都为数组的情况         if( data1 instanceof Array){             if(typeof key !== 'string') return console.warn('第三个参数 key 应为字符串')             if(!key.length) return console.warn('第三个参数 key 长度不应为空')             if(typeof key === 'undefined') return console.warn('请传入第三个参数 key')              //找出最长的数组             let maxArr = data1.length > data2.length ? data1:data2             //找出最长的数组             let minArr = data1.length < data2.length ? data1:data2             //临时存放数据的数组             let sumArr = []             //临时存放数据的对象              let obj = {}              maxArr.forEach((item,index)=>{                 //此时短的那一个数组已经循环完了                 if(minArr[index] === undefined){                     //只需要处理较长的那个数组                     return obj[item[key]] = {...maxArr[index]}                 }                  //这里是短的那一个数组还没循环完的情况                 obj[item[key]] = {...maxArr[index],...minArr[index]}             })             sumArr = Object.values(obj)              return sumArr                      }else{             //都为对象             //此处为浅合并 key一致会被替换             return {...data1,...data2}         }              }  

简单测试一下

    mergeArrAndObj([{id:2,c:2}],[{id:2,a:2},{id:3,a:3}],'id')      [         {id:2,c:2,a:2},         {id:3,a:3}     ]