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

时间:2017-01-26 17:39:54

标签: javascript ecmascript-6 local-storage

我有这个功能

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)。那么,如何在整个存储对象中进行迭代,修改其子对象,然后保存修改后的父对象?

1 个答案:

答案 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)。

  1. "为什么你的代码工作而不是mys?":
  2. 你做什么

    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...