无需使用map或循环为数组中所有对象添加新属性
无需循环/Map给数组对象批量添加属性的方案
嘿,我懂你不想用循环或者map处理长数组的心思——200+元素的数组,谁都想找个更高效省心的路子对吧?这里有两个能满足你需求的方案,看情况选就行:
方案一:利用原型链批量添加(性能最优)
如果你的数组里全是普通字面量对象(就是{}这种直接创建的对象),那可以直接给它们的原型添加属性,这样所有对象都会继承这个属性,完全不用遍历数组:
let data = [{name:"xyz"},{name:"abc"}]; let age = 5; // 给数组内对象的原型添加age属性 Object.getPrototypeOf(data[0]).age = age;
注意点:
- 这个属性是存在原型上的,不是每个对象自己的属性。如果后续你给某个对象单独赋值
obj.age = 10,会覆盖原型上的值,不会影响其他对象; - 如果数组里的对象来自不同的构造函数(原型不一样),这个方法就不适用了。
方案二:JSON序列化反序列化(更稳妥,适合标准JSON对象)
如果想要每个对象都拥有自己独立的age属性,或者数组里的对象包含原型链外的其他特性,那可以用JSON转译的技巧,不用遍历就能批量添加:
let data = [{name:"xyz"},{name:"abc"}]; let age = 5; // 序列化后拼接属性,再反序列化回来 data = JSON.parse(JSON.stringify(data).replace(/}/g, `,"age":${age}}`));
注意点:
- 这个方法会把对象转成JSON字符串再转回对象,所以对象里的函数、
undefined、Symbol这类JSON不支持的类型会被丢失; - 适合纯数据型的对象,处理起来简单直接。
选哪个就看你的实际场景啦,要是追求性能且对象都是普通字面量,方案一绝对是首选;要是需要每个对象都有自己的age属性,就用方案二。
内容的提问来源于stack exchange,提问作者Narendra Chouhan
相关产品推荐
相关产品推荐

