如何根据key合并数组中的对象
如何根据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
js合并两个数组
}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}
]

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。