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

Object.assign复制JSON数据时数组对象生成数字键的原因与解决

问题成因
  • Object.assign的逻辑是将所有源对象的可枚举自有属性浅拷贝到目标对象上。
  • 你调用MyData.map(...)后本身已经得到了结构符合预期的对象数组,但数组本质是一类特殊对象,它的可枚举自有属性就是0、1、2这类数字索引,对应数组每一项的内容。
  • 你初始化的目标是new Object()生成的普通空对象{},把map返回的数组作为源传入Object.assign后,数组的所有索引键值会被直接拷贝到这个普通对象上,最终就得到了外层带数字键的类数组结构,不是你想要的纯对象数组。
修复代码

要求保留new Object和Object.assign实现的前提下,只需要把初始目标改为数组实例即可——new Object传入空数组作为参数时,会返回数组类型的实例,符合API使用要求:

// 初始化数组类型的目标实例
let newObject = new Object([]); 
Object.assign(newObject, MyData.map(data => ({
  personal_id : data._id,
  idx : data.index,
  voiceLines : data.tags
})));

console.log(newObject);

执行后打印的结果就是标准对象数组,没有外层包裹的数字键,每一项都是你映射生成的personal_id、idx、voiceLines三个字段的结构。

如果你不需要严格限制目标初始化的类型,也可以在你原有代码的基础上,通过Object.values(newObject)提取所有数字键对应的值,直接得到对象数组,但这种写法没有从根源上避免无效的属性拷贝,不推荐使用。

内容的提问来源于stack exchange,提问作者Metgher Andrei

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:48:51