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

JavaScript修改对象键时意外改动其他关联键的问题求助

问题原因与解决方案:修改对象属性时意外影响其他键值

问题根源

你遇到的问题是引用赋值导致的对象共享。JavaScript中对象、数组属于引用类型,当你把example_keyframes直接赋值给myObject[2]和myObject[3]时,这两个键实际上指向内存中的同一个对象。修改myObject[3].keyframes时,本质是在修改这个共享对象,因此会同步影响myObject[2]的对应属性。

解决方案

方案1:每次创建全新对象实例

放弃复用example_keyframes,每次添加新键时生成独立的对象:

// 添加第二个键
let lastkey = Object.keys(myObject)[Object.keys(myObject).length - 1];
myObject[parseInt(lastkey)+1] = {
    keyframes: [
        {"posX": "0", "posY": "0"},
        {"posX": "400", "posY": "0"},
        {"posX": "100", "posY": "0"}
    ]
};

// 添加第三个键时重复上述逻辑
lastkey = Object.keys(myObject)[Object.keys(myObject).length - 1];
myObject[parseInt(lastkey)+1] = {
    keyframes: [
        {"posX": "0", "posY": "0"},
        {"posX": "400", "posY": "0"},
        {"posX": "100", "posY": "0"}
    ]
};

方案2:深拷贝已有对象

如果需要复用example_keyframes的结构,通过深拷贝生成独立对象,避免引用共享。对于嵌套对象,最简便的方法是利用JSON序列化:

// 添加第二个键
let lastkey = Object.keys(myObject)[Object.keys(myObject).length - 1];
myObject[parseInt(lastkey)+1] = JSON.parse(JSON.stringify(example_keyframes));

// 添加第三个键时同样使用深拷贝
lastkey = Object.keys(myObject)[Object.keys(myObject).length - 1];
myObject[parseInt(lastkey)+1] = JSON.parse(JSON.stringify(example_keyframes));

方案3:展开运算符实现嵌套拷贝

针对层级不深的对象,可通过展开运算符逐层拷贝,确保每个嵌套的引用类型都独立:

myObject[parseInt(lastkey)+1] = {
    keyframes: [...example_keyframes.keyframes.map(item => ({...item}))]
};

修改后再运行代码,修改myObject[3]的属性时就不会影响myObject[2]了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 02:18:21