[英]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)。
你做什么
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.