我有一个简单的对象,我正在尝试修改,结果令人费解。这在node.js中执行。
我有一个如下对象:
var element = {
ident: "value",
green:
{ date: value2,
key: value3,
key2: value4,
key3:
{ id1:
{ p1: [],
p2: [],
p3: [],
p4: [] },
{ id2:
{ p1: [],
p2: [],
p3: [],
p4: [] },
{ id3:
{ p1: [],
p2: [],
p3: [],
p4: [] } } },
red:
{ date: value5,
key: value6,
key2: value7,
key3:
{ id1:
{ p1: [],
p2: [],
p3: [],
p4: [] },
{ id2:
{ p1: [],
p2: [],
p3: [],
p4: [] },
{ id3:
{ p1: [],
p2: [],
p3: [],
p4: [] } } } };
当我尝试将单个“p2”的值设置为数组时,我已经填充了一些数据,设置了该颜色的每个“p2”,而不仅仅是引用的那个。我设置的值是这样的:
element [green] .key3 [id1] [p2] = someArray;
括号中的所有内容都是指向键名的变量。上面的输出设置3个值...绿色 - 绿色.key3.id1.p2,.id2.p2和.id3.p2的所有ID都是我想要的绿色值.key3.id3.p2 < / p>
关于这里可能发生什么的任何想法?在此先感谢您的帮助。
答案 0 :(得分:0)
你是如何构建这个对象的?可能是您为一个颜色中的每个p2指定了相同的空数组。当你这样做时,每个p2将是对同一个数组的引用,因此将值推入一个显然会将该值推入每个数组中。要测试这些是否是对同一数组的引用,请检查:
green.key3.id1.p2 === red.key3.id2.p2
如果这给你true
,那么我上面说的就是这种情况。基本上这就像:
var a = [];
var b = a;
var c = a;
b.push(1); // b = [1], c = [1];
b === c; // true, since they are really references to the same object (array).
重新阅读后,可能实际上id1
,id2
等被分配给同一个对象。即。
var id = { p1: [], p2: [], p3: [] };
green.key3.id1 = id;
green.key3.id2 = id;
如上所述,你可以通过以下方式测试是否是这种情况:
// true if these are really references to the same object.
green.key3.id1 === green.key3.id2;
如果您希望在没有此行为的情况下快速重用代码,则可以执行以下操作:
function Id() {
this.p1 = [];
this.p2 = [];
this.p3 = [];
}
green.key3.id1 = new Id();
green.key3.id2 = new Id();
每个new Id()
都是一个新对象。