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

Javascript 节点JS-对象值更新奇怪行为,javascript,arrays,node.js,object,properties,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:

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

元素[green].key3[id1][p2]=someArray

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


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

您是如何构建此对象的?可能是您为颜色中的每个p2分配了相同的空数组。当您这样做时,每个p2都将是对同一数组的引用,因此将一个值推到一个数组中显然会将该值推到每个数组中。要测试这些是否是对同一数组的引用,请选中:

green.key3.id1.p2 === red.key3.id2.p2
如果这是真的,那么我上面说的就是事实。这基本上是这样的:

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等被分配给同一对象。i、 e

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();

每个新Id都将是一个新对象。

这个问题肯定有比你透露的更多的东西。也许可以向我们展示更多关于使用元素[green]的代码;情况似乎并非如此,因为OP似乎正在替换数组,而不是附加到一个元素[green]。[key3[id1][p2]=someArray@是的,重读一遍,发现了。不过,我怀疑罪犯仍然是一个有参考资料的问题。答案已更新。这些是对同一数组的引用。我正在重用一些代码来构建它,这就是问题所在。谢谢如果可以的话,我会投票的。