簡體   English   中英

節點JS-對象值更新異常行為

[英]Node JS - Object Value Update Strange Behavior

我有一個要修改的簡單對象,結果令人費解。 這是在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個值... Green-green.key3.id1.p2,.id2.p2和.id3.p2的所有id都設置為我只想要green.key3.id1.p2的值

關於這里可能發生什么的任何想法? 先謝謝您的幫助。

您如何構建此對象? 可能是您已經為每種顏色的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()將是一個新對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM