一种深拷贝的处理思绪

背景

近来在做数据处置惩罚的过程当中,碰到一个题目,以下:
背景通报过来一组数据 Array,每一个数组元素内里又包含了子对象,我要对这组数据举行处置惩罚,然则不想影响到原数组,同时原数组能够会要举行多个方向的数据格式化,为了衬着差别的界面。

原始数据

let data = [
    {
        id: 1,
        name: 'luoxue',
        age: 25
    },
    {
        id: 2,
        name: 'kk',
        age: 22
    },
    {
        id: 3,
        name: 'qiuxia',
        age: 22
    }
];

处置惩罚计划

1、直接用 = 赋值

let myData = data; // 我要的数据
let yourData = data; // 你要的数据
myData[0].name = 'luoxue-xu'; // 我要修改成我的名字
yourData[0].name = 'kk-z'; // 你要修改成你的名字
console.log(data[0].name); // kk-z

不管是对 myData 照样对 yourData 操纵,都转变了本来的 data,我心慌啊,原数据怎么能乱动呢,假如它主人追查怎么办?我又弱又饿,跑不过也打不过,冥思苦想,有了第二种思路。

2、用 slice 来完成数组的拷贝,先尝尝

let myData = data.slice(0); // 传入0 示意截取悉数
let yourData = data.slice(0); // 你家的
myData[0].name = 'luoxue-xu'; // 我要修改成我的名字
console.log(data[0].name); // luoxue-xu

看到效果我又懵了,你这是几个意义啊,我死了两千多个脑细胞才想出来的思路,居然照样会转变,查询的材料显现 slice 确切能够完成拷贝而不转变原数组的功用啊,岂非看漏了。
再仔细看了遍材料,有点思路,slice 虽然返回的是一个新数组,然则元素假如是对象,该援用的照样援用,本来如此。
slice 相当于数组的浅拷贝,假如数组中的元素是基础范例,那就能够经由过程它来完成拷贝。

江湖走马,风也好,雨也罢 ——《道君》

3、用 JSON 转,先转字符串,再转回对象

let myData = JSON.parse(JSON.stringify(data)); // 我家的
let yourData = JSON.parse(JSON.stringify(data)); // 你家的
yourData[0].name = 'kk-z'; // 你名字带走
console.log(data[0].name); // luoxue

咦,还有点靠谱的模样,居然能够,这么简朴,不会有什么坑吧,先用着尝尝,不过 jQuery.extend 也能够完成,岂非它也是如许做的,不太能够,再思索思索。

4、本身写个深拷贝的函数 clone

const clone = (b) => {
  if(Array.isArray(b)) {
    // 数组拷贝
    let obj = [];
    for(let i = 0; i < b.length; i++) {
      obj[i] = clone(b[i]);
    }
    return obj;
  }else if(b instanceof Object) {
    // 对象拷贝
    let obj = {};
    for(let attr in b) {
      obj[attr] = clone(b[attr]);
    }
    return obj;
  }else {
    return b;
  }
}
let myData = clone(data); // 我家的
let yourData = clone(data); // 照样我家的
yourData[0].name = 'luoxue-kk'; // 照样我家的
console.log(data[0].name); // 返回什么,不通知你,虽然报错了.

有空能够研究一下 Object.assign 的运用。

    原文作者:luoxuexu
    原文地址: https://segmentfault.com/a/1190000009855964
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞