为什么当我试图只设置一个对象的键时,所有对象的键都设置为值?
Why all the object's keys set out to the values when I am trying to set only one object's key?
I have stored some empty objects inside the array 表示在数组中存储了一些空对象,键值对使用 for-loop
生成。
这是我的做法:
var events = [], obj, n = 100;
obj = {
a: 0,
b:{},
"timestamp":new Date()
};
for(var i=0;i<n;i++)
{
events.push(obj);
}
events.forEach((item, i) => {
for(var i=0;i<40;i++)
item.b["trackID"+i] = 0;
});
所以最终的事件数组变成包含 100 个对象,所有键都初始化为零。
现在我想手动设置任何特定的键,但我面临的问题是所有对象中的所有键都会更新为相同的值,无论我设置哪个键。我只想将值设置为相应的对象键。为什么这里出了什么问题?
例如,当尝试设置第 5 个对象时假设 a 和 b of trackID25 分别为 5 和 7:
events[4].a = 5
events[4].b.trackID25 = 7
但是所有事件对象的键a和b(trackIDs)键分别设置为5和7的值。
为什么会这样?????
Javascript 将对象视为内存引用,因此您推入数组的内容基本上是指向相同内存地址的相同对象。
您可以通过复制对象来避免这个问题。
这个问题有很多解决方案,但我建议您使用 lodash.deepClone()
来解决。
如果您更喜欢本机解决方案,复制对象的最简单方法是 JSON.parse(JSON.stringify(obj))
I have stored some empty objects inside the array 表示在数组中存储了一些空对象,键值对使用 for-loop
生成。
这是我的做法:
var events = [], obj, n = 100;
obj = {
a: 0,
b:{},
"timestamp":new Date()
};
for(var i=0;i<n;i++)
{
events.push(obj);
}
events.forEach((item, i) => {
for(var i=0;i<40;i++)
item.b["trackID"+i] = 0;
});
所以最终的事件数组变成包含 100 个对象,所有键都初始化为零。
现在我想手动设置任何特定的键,但我面临的问题是所有对象中的所有键都会更新为相同的值,无论我设置哪个键。我只想将值设置为相应的对象键。为什么这里出了什么问题?
例如,当尝试设置第 5 个对象时假设 a 和 b of trackID25 分别为 5 和 7:
events[4].a = 5
events[4].b.trackID25 = 7
但是所有事件对象的键a和b(trackIDs)键分别设置为5和7的值。 为什么会这样?????
Javascript 将对象视为内存引用,因此您推入数组的内容基本上是指向相同内存地址的相同对象。
您可以通过复制对象来避免这个问题。
这个问题有很多解决方案,但我建议您使用 lodash.deepClone()
来解决。
如果您更喜欢本机解决方案,复制对象的最简单方法是 JSON.parse(JSON.stringify(obj))