You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中有没有更快捷的方法将对象键值复制到同一对象的新键?

现有实现问题说明

你的当前写法存在几个明显问题:

  1. 第2步的map返回的新数组没有被接收赋值,这行代码完全无效,新增空value的逻辑根本没执行
  2. 遍历数组不需要转Object.entries,直接调用数组的forEach即可,属于冗余操作
  3. 整个流程做了3次无意义的遍历,性能差,而且你展开数组只复制了数组本身,数组内的对象还是和原API返回的对象共享引用,修改value会污染原响应数据
  4. 你贴的处理后结果第二个对象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,属于有副作用的操作

原有实现的优缺点

  • 优点:逻辑思路方向正确,知道要先复制原数据再做修改,避免直接修改原数组引用
  • 缺点:
    • 存在无效代码,map调用无赋值不生效
    • 遍历次数过多,性能差
    • 未处理对象引用问题,会污染原响应数据
    • 写法冗余,可读性差

内容的提问来源于stack exchange,提问作者aulia amirullah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:54:01