节点JS - 对象值更新奇怪的行为

时间:2014-02-14 22:20:52

标签: javascript arrays node.js object properties

我有一个简单的对象,我正在尝试修改,结果令人费解。这在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>

关于这里可能发生什么的任何想法?在此先感谢您的帮助。

1 个答案:

答案 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).

修改

重新阅读后,可能实际上id1id2等被分配给同一个对象。即。

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()都是一个新对象。