如何用ES6简洁实现按索引合并两个无共同属性的对象数组?
解决方案
可以利用ES6的扩展运算符结合可选链操作符(ES2020)实现简洁的合并逻辑,既保留数组a的所有元素,又避免数组长度不一致时的报错:
let m = a.map((item, index) => ({ ...item, day: b[index]?.day }));
说明:
...item:将数组a中对象的所有属性展开到新对象中,比手动指定id更通用,能适配a对象属性扩展的场景。b[index]?.day:使用可选链操作符,当b[index]不存在(即索引超出b的长度)时,表达式返回undefined,不会触发"Cannot read properties of undefined"的错误。
如果运行环境不支持可选链,可用短路求值替代:
let m = a.map((item, index) => ({ ...item, day: b[index] && b[index].day }));
进阶:不添加多余的day属性
若希望当b对应索引无元素时,新对象中不出现day属性,可结合条件对象展开:
let m = a.map((item, index) => ({ ...item, ...(b[index] && { day: b[index].day }) }));
这种写法基于函数式风格,比forEach更简洁且符合ES6+编码习惯。
内容的提问来源于stack exchange,提问作者LocustHorde
相关产品推荐
相关产品推荐

