如何合并两个对象数组并按公共字段匹配整合对应属性
实现方案
方案1:Map映射实现(数据量大时性能更优)
先将array2转为以capital为key的映射表,减少遍历次数:
// 构建capital到population的映射,数组转字符串做key避免引用比对失败 const capitalPopMap = new Map( array2.map(item => [item.capital.join(','), item.population]) ) const result = array1.map(item => { const currentCapitalKey = item.name.capital.join(',') const population = capitalPopMap.get(currentCapitalKey) // 合并属性,不修改原数组原始值 return { ...item, name: { ...item.name, ...(population !== undefined && { population }) } } })
方案2:find方法实现(适合小数据量,匹配你之前尝试的实现思路)
你之前实现失败大概率是因为直接用===比较capital数组,数组是引用类型,值相同的不同数组比对会返回false,修正后代码如下:
const result = array1.map(item => { // 比对capital前先转成字符串,保证值相同就能匹配 const match = array2.find(ele => ele.capital.join(',') === item.name.capital.join(',')) return { ...item, name: { ...item.name, ...(match && { population: match.population }) } } })
注意事项
如果你的capital数组可能存在元素顺序不同但值一致的情况,比如["New York", "Albany"]和["Albany", "New York"]需要视为相同关联项,可以把join前的数组先做排序:item.capital.sort().join(',')。
内容的提问来源于stack exchange,提问作者Md Azadur Rahman
相关产品推荐
相关产品推荐

