多层数组如何遍历_数组、对象的深拷贝
⽬录
1、深拷贝背景
2、⼀层深拷贝(数组、对象)
3、多层深拷贝
⼀、深拷贝背景
我们需要得到⼀份新的data,增删改查操作都不会影响原始数据。请问如何实现,如下
var arr = [
{ number: 1 },
{ number: 2 },
{ number: 3 }
];
var newarr = arr;
newarr[0]=1;
console.log(arr,newarr)
原因是因为应⽤类型的赋值,只是修改了指针的指向 。可查MDN数据类型
⼆、数组的⼀层拷贝
1. slice
2. concat
3. [...]
4. 循环
var arr = [1,2,3];
var arr1,arr2,arr3;
arr1 = arr.slice(0);
arr2 = at();
arr3 = [...arr];
arr[0]=100;
console.log(arr,arr1,arr2,arr3);⼆.⼀、对象的⼀层拷贝
1. Object.assign
2. {...}
var obj ={
name:'zh',
age:30
}
var obj1,obj2;
obj1 = Object.assign({},obj);
obj2 = {...obj};
obj.name = '你全家都叫zh'
console.log(obj,obj1,obj2);
三、多层深拷贝
思路:
1. ⾮Object类型,直接赋值
2. 递归⽬标对象的每⼀项
// 深拷贝
var array = [
{ number: 1 },
{ number: 2 },
{ number: 3 }
];
function shencopy(obj){
if(typeof obj !== 'object'){
return obj
}
var res = Array.isArray(obj)?[]:{}; for(let i in obj){
res[i] = shencopy(obj[i]);
}
return res
}
console.log(shencopy(array)); PS:涉及知识点
1、基本数据类型、应⽤类型 MDN
2、typeof返回 MDN
3、数组、对象判断
var arr = [1,2,3];
var obj = {
name:'zh'
}
//⽅法⼀ constructor
// ⽅法⼆ instanceof
arr instanceof Array
obj instanceof Object
//⽅法三 String
String.call(arr) === "[object Array]"
String.call(obj) === "[object Object]"
// ⽅法四 Array.isArray
Array.isArray(arr)
4、String.call()引发的思考 查看
typeof array为什么判断对象、数组要⽤Object的toString ⽽不⽤别的toString?
5、for in / for of
语句在可迭代对象(包括 Array, Map, Set,语句以任意顺序遍历⼀个对象的除Symbol以外的可枚举属性。 f语句
String, TypedArray,arguments 对象等等)上创建⼀个迭代循环,调⽤⾃定义迭代钩⼦,并为每个不同属性的值执⾏语句
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论