JavaScript中有没有更快捷的方法将对象键值复制到同一对象的新键?
现有实现问题说明
你的当前写法存在几个明显问题:
- 第2步的
map返回的新数组没有被接收赋值,这行代码完全无效,新增空value的逻辑根本没执行 - 遍历数组不需要转
Object.entries,直接调用数组的forEach即可,属于冗余操作 - 整个流程做了3次无意义的遍历,性能差,而且你展开数组只复制了数组本身,数组内的对象还是和原API返回的对象共享引用,修改
value会污染原响应数据 - 你贴的处理后结果第二个对象
value为1是笔误,按逻辑应该等于id值4
最优实现方案
分两种常用场景提供实现:
方案1:不可变修改(推荐,绝大多数业务场景适用)
const stringOptionsOutlet = response.data.outlet.map(item => ({ ...item, value: item.id }))
优缺点
- 优点:
- 仅需1次遍历,性能最优,代码极简可读性高
- 所有对象都是新创建的,不会修改原API返回的原始数据,无副作用
- 缺点:
- 超大数组场景(十万级以上元素)下,批量创建新对象会有少量额外内存开销,普通业务场景完全可以忽略
方案2:可变修改(适合性能优先、不需要保留原响应数据的场景)
// 不需要保留原数组引用,直接修改原数组对象 response.data.outlet.forEach(item => { item.value = item.id }) const stringOptionsOutlet = response.data.outlet // 如果需要复制数组、保留原数组结构,但可以修改对象属性 const stringOptionsOutlet = [...response.data.outlet] stringOptionsOutlet.forEach(item => { item.value = item.id })
优缺点
- 优点:
- 不需要创建新的对象实例,内存开销更低,超大数组下性能更好
- 语法同样简洁,只需要1-2次遍历
- 缺点:
- 会直接修改原API返回的对象属性,如果其他业务逻辑依赖原始的无
value属性的响应数据,会引发bug,属于有副作用的操作
- 会直接修改原API返回的对象属性,如果其他业务逻辑依赖原始的无
原有实现的优缺点
- 优点:逻辑思路方向正确,知道要先复制原数据再做修改,避免直接修改原数组引用
- 缺点:
- 存在无效代码,map调用无赋值不生效
- 遍历次数过多,性能差
- 未处理对象引用问题,会污染原响应数据
- 写法冗余,可读性差
内容的提问来源于stack exchange,提问作者aulia amirullah
相关产品推荐
相关产品推荐

