经常会遇到实现对象深拷贝和数组去重问题,在这里做个总结。
一、对象或数组深拷贝
深拷贝即嵌套在深层的引用类型的变量都一一拷贝,下面看浅拷贝例子。
let obj1 = {
name: 'kaven',
info: {age: 18}
}
let obj2 = {...obj1}
obj2.info.age = 20
//期望输出
// obj1: {name: "kaven", info: {age: 18}}
// obj2: {name: "kaven", info: {age: 20}}
//结果
console.log('obj1:', obj1) // obj1: {name: "kaven", info: {age: 20}}
console.log('obj2:', obj2) // obj2: {name: "kaven", info: {age: 20}}
//以上操作就是属于浅拷贝
深拷贝可以使用let obj2 = JSON.parse(JSON.stringify(obj1)) 这种方法有个缺点就是函数类型不能被序列化,如果对象里有函数类型的属性会导致这个函数没有被拷贝过去。
//手写递归可以完美的实现深拷贝,唯一缺点就是如果嵌套层级深会消耗一定性能。
const deepCopy = function (obj) {
let newObj = obj instanceof Array ? [] : {};
if (typeof obj !== 'object') return obj;
for (let key in obj) {
if (typeof obj[key] !== 'object') {
newObj[key] = obj[key];
} else {
newObj[key] = deepCopy(obj[key]);
}
}
return newObj;
}
二、数组去重
1.利用es6 new Set()类型去重
//这种是最简洁的但是缺点是对象类型无法去重
let arr2 = [...new Set(arr1)]
2.手写循环利用indexOf和JSON.stringify去重
//这种方法可以去重对象类型
function unique (arr) {
let newArr = []
let obj = {}
arr.forEach(item => {
if (typeof item !== 'object') {
if (newArr.indexOf(item) === -1) {
newArr.push(item)
}
} else {
let str = JSON.stringify(item)
if (!obj[str]) {
newArr.push(item)
obj[str] = 1
}
}
})
return newArr
}