nodejs typescript将现有属性的值从一个对象复制到另一个对象

polkgigr  于 2023-03-29  发布在  Node.js
关注(0)|答案(1)|浏览(270)

我有一个属性为name, value, desc的object1,还有一个属性为name, value, desc, time, frame, getName, ...的object2。
现在我想创建一个新的object1,但它的所有值都来自object1中的属性。
例如:

class Object1 {
  name!: string;
  value!: number;
  desc!: string;
}

class Object2 {
  name!: string;
  value!: number;
  desc!: string;
  time!: date;
  frame!: number;
}

let object2: Object2 = getMyObject();
// object2 has now name: "test", value: 5, desc: "testDesc", time: "27-03-2023", frame: 7, getName: function(), [...]

let object1: Object1 = new Object1();

fillValuesFromObject(object1, object2) // This should fill all the values of existing properties

console.log(object1); // name: "test", value: 5, desc: "testDesc"
// So all other properties from object2 that object1 doesn't have are ignored

我怎么能做这个fillValuesFromObject

roejwanj

roejwanj1#

更新:当我写这个问题的答案时,直到最后我都不清楚作者想要实现什么。目前,阅读这个问题,我会为他提供一个完全不同的解决方案。

function fillValuesFromObject<KType, KType2>(obj1: KType, obj2: KType2, keysToCopy: ((keyof KType) & (keyof KType2))[]) {
  for (const key of keysToCopy) {
    obj1[key] = obj2[key] as any;
  }
}

fillValuesFromObject(object1, object2, ['name', 'desc', 'value'])

旧答案:
出现的第一个问题是您要复制的对象是通过引用复制还是克隆?复制对象的最简单的选择是简单地使用spread运算符:

const newObject = {...oldObject};

Spreed操作符不会克隆对象的原型,因此只会创建一个形状相同的对象,但它不会有一个公共的prototype。您可以使用(但如果您关心此解决方案的性能,最好不要使用)将新对象的原型设置为被视为同一个类:

Object.setPrototypeOf(newObject, oldObject);

克隆对象的另一个选择是使用Object类的静态assign方法(它也适用于类):

const newObject: Object1 = Object.assign(new Object1(), oldObject);

这两个方法都会以1:1的比例复制值,只是要注意里面的嵌套对象,因为它们会作为引用复制,也就是说,在oldObject中编辑一个嵌套对象,由于引用了同一个对象,也会改变newObject中的值
阅读更多关于working with objects
如果你想完全克隆一个对象,包括它的嵌套对象,你可以使用lodash依赖项中的deepClone方法。

const {deepClone} = require('lodash');
const newObject = deepClone(oldObject);

相关问题