【问题标题】:Node JS - Object Value Update Strange BehaviorNode JS - 对象值更新奇怪的行为
【发布时间】:2014-03-14 11:22:16
【问题描述】:

我正在尝试修改一个简单的对象,结果令人费解。这是在 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”,而不仅仅是引用的那个。我这样设置值:

元素[绿色].key3[id1][p2] = someArray;

括号中的所有内容都是指向键名的变量。上面的输出设置了 3 个值... Green 的所有 id - green.key3.id1.p2、.id2.p2 和 .id3.p2 都为我只想要的值 green.key3.id1.p2

关于这里可能发生的事情有什么想法吗?提前感谢您的帮助。

【问题讨论】:

  • 这个问题肯定比你透露的更多。也许向我们展示更多关于您在哪里使用 element[green].key3[id1][p2] = someArray; 的代码

标签: javascript arrays node.js object properties


【解决方案1】:

你是如何构建这个对象的?可能是您已将相同的空数组分配给颜色中的每个 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() 都是一个新对象。

【讨论】:

  • 情况似乎并非如此,因为看起来 OP 正在替换数组而不是附加到一个 element[green].key3[id1][p2] = someArray;
  • @Xotic750 是的,重读并发现了这一点。我怀疑罪魁祸首仍然是参考文献的问题。答案已更新。
  • 这些是对同一个数组的引用。我正在重用一些代码来构建它,这是问题所在。谢谢。如果可以的话,我会投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 2017-11-07
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多