JavaScript如何将对象的静态元素追加到对象数组的每个对象中?
给数组每个对象追加公共属性的解决方案
嘿,我来帮你搞定这个问题!其实实现需求的方法很简单,甚至比你尝试的map+Object.keys组合更直观,先看最简洁的实现:
方法1:ES6对象展开运算符(推荐)
这是目前最简洁易读的写法,直接利用对象展开语法合并属性:
const data = { type: "hello", point: 1.8 }; const raw = [ { x: [1, 2], y: [-1.1, -1.2] }, { x: [14, 24], y: [-1.14, 1.24] } ]; // 核心代码:用map遍历数组,每个对象合并data的属性 const result = raw.map(item => ({ ...item, ...data }));
这段代码会遍历raw数组的每个元素,把原对象item的所有属性和data的属性展开合并成一个新对象,完全符合你想要的结果,而且不会修改原数组里的对象(纯函数写法,更安全)。
方法2:用Object.keys实现(兼容旧环境)
如果你因为环境限制必须用Object.keys,那可能是之前的写法没处理好对象复制的问题,正确的写法应该是:
const result = raw.map(item => { // 先复制原对象的属性,避免修改原数组的原始对象 const newItem = Object.assign({}, item); // 遍历data的所有键,逐个追加到新对象 Object.keys(data).forEach(key => { newItem[key] = data[key]; }); return newItem; });
这里要注意必须先复制原对象,如果直接修改item的话,会把原数组里的对象也改掉,这通常不是我们想要的行为。
为什么你之前的尝试没成功?
推测你可能是在map里直接修改了原对象,或者在遍历Object.keys时没有正确创建新对象。比如如果写成这样就会有问题:
// 错误示例:直接修改原对象,虽然结果对,但污染了原数组 const result = raw.map(item => { Object.keys(data).forEach(key => { item[key] = data[key]; }); return item; });
这种写法会改变raw数组里的原始对象,而我们通常希望保持原数据不变,所以一定要创建新对象来合并属性。
内容的提问来源于stack exchange,提问作者Sigex
相关产品推荐
相关产品推荐

