js数组已经实现深拷贝,但是修改其中一个数组的值,其他数组的值会改变?

_createProps: function (props){
    let colProp = [], rowProp = [], propsAry = [], temp = [];

    if (props[0]){
      props[0].childsCurGoods.forEach(function(n,i){
        colProp.push({id:n.id,name:n.name,buyNum:0});
      });
      propsAry = colProp;
      if (props[1]){
            props[1].childsCurGoods.forEach(function (n, i) {
             
              temp[i] = [];
              for (let j = 0; j < colProp.length;j++){
                temp[i].push(colProp[j]);
              }
              rowProp.push({ id: n.id, name: n.name, child: temp[i]})
            });

            propsAry = rowProp;
          }
    }
    return propsAry;
  }```
在小程序某一页面有这么一函数,目的是将一段数据过滤我需要的如下数据格式:

res:[

{
    "id":1,
    "name":"www",
    "child":[
        {
            "id":2,
            "name":"ssss",
            "buyNum":23
        },
        {
            "id":2,
            "name":"ssss",
            "buyNum":23
        },
        {
            "id":2,
            "name":"ssss",
            "buyNum":23
        },
        {
            "id":2,
            "name":"ssss",
            "buyNum":23
        }
    ]
}

]

现在的问题是我一改变其中一个一个对象中的chile的某个值,就会导致其他对象的child发生改变。比如我通过`res[0].child[0].buyNum = 3`,会导致res[0].child[1]、res[0].child[2]...中的buyNum的值都变成3。
阅读 2.1k
2 个回答
_createProps: function (props){
  let colProp = [], rowProp = [], propsAry = [], temp = [];

  if (props[0]){
    props[0].childsCurGoods.forEach(function(n,i){
      colProp.push({id:n.id,name:n.name,buyNum:0});
    });
    propsAry = colProp;
    if (props[1]){
      props[1].childsCurGoods.forEach(function (n, i) {
             
        temp[i] = [];
        for (let j = 0; j < colProp.length;j++){
          temp[i].push(colProp[j]); // colProp[j]是一个对象,push进去的是一个引用
        }
        rowProp.push({ id: n.id, name: n.name, child: temp[i]})
      });

      propsAry = rowProp;
    }
  }
  return propsAry;
}

使用Object.assign拷贝一下:

_createProps: function (props){
  let colProp = [], rowProp = [], propsAry = []; // 删除temp

  if (props[0]){
    props[0].childsCurGoods.forEach(function(n,i){
      colProp.push({id:n.id,name:n.name,buyNum:0});
    });
    propsAry = colProp;
    if (props[1]){
      props[1].childsCurGoods.forEach(function (n, i) {
             
        let temp = [];
        for (let j = 0; j < colProp.length;j++){
          temp.push(Object.assign({}, colProp[j]}); // 使用Object.assign拷贝一下
        }
        rowProp.push({ id: n.id, name: n.name, child: temp})
      });

      propsAry = rowProp;
    }
  }
  return propsAry;
}

很明显, 你写的并非深拷贝
luckness 说的Object.assign也只是解决了更深一层的引用, 如果你child里某个元素还有引用类型的属性, 这种情况依然会出现。

你这种的可以用JSON.parse(JSON.stringify(res))来实现

需要注意的是, 遇到值是类似function/RegExp这样的, 或是有循环引用的就不行了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题