背景
近来在做数据处置惩罚的过程当中,碰到一个题目,以下:
背景通报过来一组数据 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
的运用。