JS对象深拷贝和数组去重总结

461 阅读1分钟

经常会遇到实现对象深拷贝和数组去重问题,在这里做个总结。

一、对象或数组深拷贝

深拷贝即嵌套在深层的引用类型的变量都一一拷贝,下面看浅拷贝例子。

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.手写循环利用indexOfJSON.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
}