深拷贝数据,替换或剔除数组或对象中的某一项

1,000 阅读1分钟

相信很多小伙伴都碰到过数据的深拷贝问题,或者是改变一个数据的key的问题吧,今天就讲讲如何解决这个问题,

JSON.stringify()与JSON.parse()

最简单的深拷贝莫过于是用JSON.stringify()与JSON.parse()来实现一个深拷贝,不过它只适用于是简单的对象或数组,如果碰到对象与数组的嵌套,那就不能实现了

深拷贝方法:

/**
 * 深拷贝
 * @param obj
 */
deepClone (obj) {
  let objClone = Array.isArray(obj) ? [] : {}
  if (obj && typeof obj === 'object') {
    for (let key in obj) {
      if (obj.hasOwnProperty(key)) {
        //   判断ojb子元素是否为对象,如果是,递归复制
        if (obj[key] && typeof obj[key] === 'object') {
           objClone[key] = this.deepClone(obj[key])
        } else {
          //   如果不是,简单复制
          //  这里可以判断key和修改key
          objClone[key] = obj[key]
        }
      }
    }
  }
  return objClone
}

这是一个利用递归的方法实现的一个简单深拷贝,如果你要剔除或替换数组或对象中的某一项就可以在里面加一些逻辑判断就可以实现,当然也有简单粗暴的方法:

JSON.parse(
    JSON.stringify(arr).replace(/'旧字段'/g, "新字段")
)

这种方法只适合做些简单数据的替换