我有这个功能
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
)。那么,如何在整个存储对象中进行迭代,修改其子对象,然后保存修改后的父对象?
答案 0 :(得分:1)
您需要修改父对象:
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;
}
但是现在你的功能已经深入了解了#34;进入对象(只是说):
save("hi","a","b","c");//will save like this
a={
b={
c="hi";
}
}
另一种可能性是在最后一次迭代之前停止循环,然后记录[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中改变了某个,它实际上会改变位置432处的对象,因此b被改为。 对象中的对象看起来一样:
//another obj
100:
obj1: location:432 //our pointer to the object
因此我们的for循环(让我们停留在上面的保存示例)将跟随指向对象的指针,获取一个包含指针的属性,而不是跟随此指针指向另一个对象(a-> b - > c)。这些对象存储在mem中的某个位置。 JSON.stringify函数执行深层复制。因此它跟随每个指针并将所有必要的信息放入一个字符串(对象a b和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...