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
相关产品推荐
相关产品推荐

