使用Lodash 3.10合并两个对象数组,merge方法无效求解决方案
解决Lodash 3.10合并对象数组(按name去重)的问题
嘿,我完全懂你的困扰——你要合并两个都是{name, value}结构的对象数组,而且希望后面对象里的同名项覆盖前面的,但Lodash的merge方法在这里确实派不上用场,因为它是针对单个对象的深度合并,不是处理数组里的对象去重合并的。
下面给你两种在Lodash 3.10里完全可行的方案,都是简单高效的:
方案一:用concat + keyBy + values组合(最简洁)
这个方法利用Lodash的工具函数链式组合,一步到位:
const arr1 = [ { "name": "DESIGEMPRESA", "value": "CMIP" }, { "name": "DSP_DIRECAO", "value": "CMIP@400@1900-01-01" }, { "name": "MES", "value": "12" } ]; const arr2 = [ { "name": "DESIGEMPRESA", "value": "CMIP" }, { name: "CUSTO", value: ">100" } ]; // 合并数组 → 按name转成对象(自动覆盖同名项)→ 转回数组 const mergedArray = _.values(_.keyBy(_.concat(arr1, arr2), 'name')); console.log(mergedArray);
逻辑说明:
_.concat(arr1, arr2):把两个数组合并成一个新数组,顺序是arr1在前、arr2在后_.keyBy(..., 'name'):将合并后的数组转成以name为键的对象,后面出现的同名对象会直接覆盖前面的_.values(...):把对象里的所有值提取出来,重新变成数组,就是你要的最终结果
方案二:用reduce手动处理(更灵活)
如果你需要更自定义的逻辑,比如修改合并规则,可以用reduce来实现:
const arr1 = [ { "name": "DESIGEMPRESA", "value": "CMIP" }, { "name": "DSP_DIRECAO", "value": "CMIP@400@1900-01-01" }, { "name": "MES", "value": "12" } ]; const arr2 = [ { "name": "DESIGEMPRESA", "value": "CMIP" }, { name: "CUSTO", value: ">100" } ]; // 先合并两个数组,再用reduce遍历构建去重后的对象 const mergedObj = _.reduce(_.concat(arr1, arr2), (acc, currentItem) => { // 用name作为唯一标识,把当前对象存入累加器,自动覆盖同名项 acc[currentItem.name] = currentItem; return acc; }, {}); // 把对象转成数组 const finalArray = _.values(mergedObj);
最终结果
两种方法得到的结果都是:
[ { "name": "DESIGEMPRESA", "value": "CMIP" }, { "name": "DSP_DIRECAO", "value": "CMIP@400@1900-01-01" }, { "name": "MES", "value": "12" }, { "name": "CUSTO", "value": ">100" } ]
这两种方法在Lodash 3.10版本里都是完全支持的,你可以根据自己的需求选择~
内容的提问来源于stack exchange,提问作者Leonel Matias Domingos
相关产品推荐
相关产品推荐

