首页  编辑  

TypeScript中复制对象及属性值

Tags: /Node & JS/   Date Created:
直接使用 Object.assign(target, source)即可把source的同名属性值复制给target对象。这是浅拷贝,即如果 source 的某个属性值是对象的话,那么 target 的同名属性值会引用到 source 对应的对象,即如果修改 source.x.value ,会影响到 target.x.value。
  • 深拷贝对象A到对象B
对于简单对象:
let obj2 = JSON.parse(JSON.stringify(obj));
对于复杂对象:
function copyCommonProperties(source, dest) {
    for (let key in dest) {
        if (source.hasOwnProperty(key) && dest.hasOwnProperty(key)) {
            if (typeof source[key] === 'object' && source[key] !== null) {
                if (Array.isArray(source[key])) {
                    dest[key] = source[key].slice(); // 直接复制数组
                } else {
                    if (typeof dest[key] !== 'object' || dest[key] === null) {
                        dest[key] = {}; // 如果目标对象对应的属性不是对象,初始化一个空对象
                    }
                    copyCommonProperties(source[key], dest[key]); // 递归拷贝对象属性
                }
            } else {
                dest[key] = source[key]; // 直接复制基本类型的属性值
            }
        }
    }
}
  • 克隆对象:将原始对象拷贝到一个空对象,就得到了原始对象的克隆
function clone(origin) {
  return Object.assign({}, origin)
}
但上述方法,不能克隆继承的值,如果要保持继承链,需要使用:
function clone(origin) {
  let originProto = Object.getPrototypeOf(origin)
  return Object.assign(Object.create(originProto), origin)
}
可以试试下面的方法:
function deepCopy(obj: any): any {
  if (typeof obj === 'object') {
    if (Array.isArray(obj)) {
      return obj.map(item => deepCopy(item));
    } else {
      const newObj = {};
      for (const key in obj) {
        newObj[key] = deepCopy(obj[key]);
      }
      return newObj;
    }
  } else {
    return obj;
  }
}
使用 lodash 库创建对象的深拷贝克隆(要先 npm install lodash):
import * as _ from 'lodash';
let obj2 = _.cloneDeep(obj);