JavaScript如何合并两个对象数组并为匹配项新增对比字段
JS/TS 车辆数组合并需求实现
原始数据
现有如下两个车辆数组:
const goodCars = [ { name: 'ferrari', price: 22000, condition: { isGood: true, isBad: false } }, { name: 'ford', price: 21000, condition: { isGood: true, isBad: false } }, { name: 'bmw', price: 20000, condition: { isGood: true, isBad: false } }, ]; const badCars = [ { name: 'ford', price: 1111, condition: { isGood: false, isBad: true } }, { name: 'honda', price: 8000, condition: { isGood: false, isBad: true } }, ];
预期输出
需要合并得到如下最终数组:
const finalCarList = [ { name: 'ferrari', price: 22000, condition: { isGood: true, isBad: false } }, { name: 'ford', price: 21000, condition: { isGood: true, isBad: false }, toCompareWith: { name: 'ford', price: 1111, condition: { isGood: false, isBad: true } }, }, { name: 'bmw', price: 20000, condition: { isGood: true, isBad: false } }, { name: 'honda', price: 8000, condition: { isGood: false, isBad: true } }, ];
具体需求
- 合并
goodCars和badCars两个数组 - 若同一款车在两个数组中都存在,给
goodCars中的对应对象新增toCompareWith字段,存储badCars中匹配的车辆对象 - 无匹配的车辆直接加入结果数组即可
错误实现问题
最初尝试的嵌套map写法无法得到正确结果:
goodCars.map((gc) => { badCars.map((bc) => { if (isCarMatch(gc, bc)) { finalCarList = [ ...finalCarList, { ...gc, toCompareWith: bc }, ]; } }); });
该写法仅会把两个数组中匹配到的车辆加入结果,未匹配的goodCars条目、未匹配的badCars条目都会被遗漏,不符合需求。
正确实现
let finalCarList: Array<Car> = [...goodCars]; badCars?.forEach((bc) => { const match: Car | undefined = goodCars.find((gc) => isCarMatch(gc, bc)); match ? (match.toCompareWith = bc) // 匹配到则给goodCars的对应条目加对比字段 : (finalCarList = [...finalCarList, bc]); // 未匹配到则直接加入结果数组 });
实现逻辑:先把所有goodCars条目作为初始结果,再遍历badCars的每一项,匹配到good里的条目就加字段,没匹配到就直接塞进结果数组,逻辑简洁且覆盖所有场景。
内容的提问来源于stack exchange,提问作者arled
相关产品推荐
相关产品推荐

