簡體   English   中英

修改嵌套對象,然后返回修改后的父對象

[英]Modify nested object and then return the modified parent object

我有這個功能

function save(value, ...props)
{
    var record;
    var allRecords = JSON.parse(window.localStorage.getItem("data"));
    record = allRecords;
    for (var prop of props)
    {
        record = record[prop];
    }
    record = value;
    window.localStorage.setItem("data", JSON.stringify(allRecords));
}

其工作是在window.localStorage中保存一堆數據。 但是,由於JavaScript是一種“按值引用”語言,因此修改record不會影響父對象( allRecords )。 那么,如何遍歷整個存儲對象,修改其子對象之一,然后保存修改后的父對象?

您需要修改父對象:

function save(value, ...props)
{
  var record = allRecords = JSON.parse(window.localStorage.getItem("data"));
  var parent=record;
  for (var prop of props)
  {
      parent=record;//store before modifying, so keep the parent
      record = record[prop];
  }

 parent[prop]= value;
 window.localStorage.setItem("data", JSON.stringify((allRecords));
 return parent;
}

但是,現在您可以將函數“深入”到對象中(只是說):

save("hi","a","b","c");//will save like this
a={
   b={
     c="hi";
   }
}

另一種可能是在最后一次迭代之前停止循環,然后執行record [prop] = value。

1.對象的存儲方式:通過指針存儲對象。 因此在內存中看起來像這樣(偽代碼):

//a memory location holding an object
432:
 val1:1
 val2:2

如果您說對象的名稱為a,則存儲a的方式如下:

a = location:432

如果復制它(例如使用b = a),則僅復制指針而不復制對象:

a = location:432
b = location:432

如果更改對象a中的sth,實際上它將更改位置432處的對象,因此將b更改為。 對象中的對象外觀相同:

//another obj
100:
   obj1:  location:432 //our pointer to the object

因此,我們的for循環(讓我們留在最上面的保存示例中)將跟隨對象的指針,獲得持有指針的屬性,而不是將此指針跟隨另一個對象(a-> b-> c)。 這些對象存儲在內存中的某個位置。 JSON.stringify函數執行深層復制。 因此,它跟隨每個指針並將每個必要的信息放入一個字符串(對象ab和c)。

  1. “為什么您的代碼有效而我的代碼無效?”:

你做什么

value=obj[key];
value="new";

我所做的:

obj[key]="new";

但是那是一樣的嗎? 不。 讓我們看一下內存中的數據:

  //you
 //before
value:undefined
obj:
    key:"old"

//copying
value:"old"
obj:
     key:"old"

//changing

value:"new"
obj:
      key:"old" //never changed...

暫無
暫無

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

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