将对象映射到其他对象的简洁方法?
Clean way to map objects to other objects?
有没有什么好的方法可以将对象映射到其他对象?也欢迎图书馆推荐。
例如,假设我有这些 类:
export class Draft {
id: number;
name: string;
summary: string;
}
export class Book {
id: number;
name: string;
info: Info;
}
export class Info {
value: string;
}
传统上,要将字段从 Draft
映射到 Book
,我必须为每个字段手动执行此操作:
export class Book {
[...]
fromDraft(Draft draft) {
this.id = draft.id;
this.name = draft.name;
this.info = new Info();
this.info.value = draft.summary;
}
}
是否有更简单的方法来映射以相同方式命名的对象字段?例如 Draft
和 Book
的 id
和 name
字段,同时还能够定义自定义映射,例如从 draft.summary
到 book.info.value
.
请注意,这与我的实际用例相去甚远。在这里手动赋值并没有那么糟糕,但是对于具有许多类似命名字段的对象来说,这是一件很麻烦的事情。
谢谢!
关于复制同名属性,可以使用Object.assign:
fromDraft(Draft draft) {
Object.assign(this, draft);
this.info = new Info();
this.info.value = draft.summary;
}
问题是它也会创建 this.summary
,但这是一种复制属性的便捷方式,因此如果您可以以不同的方式为 类 建模,那么您就可以使用它。
另一种选择是拥有共享 属性 名称的列表,然后对其进行迭代:
const SHARED_NAMES = ["id", "name"];
fromDraft(Draft draft) {
SHARED_NAMES.forEach(name => this[name] = draft[name]);
this.info = new Info();
this.info.value = draft.summary;
}
无论使用 TypeScript,您都可以使用 lodash _.mergeWith
并传递您的合并功能。
优点:更通用(如果你有更多逻辑可以添加它(例如复杂类型)
缺点:你需要lodash
类似于:
var a = {
foo: [1, 2, 3],
bar: true
}
var b = {
foo: [4, 5, 6, 7],
bar: false
}
var c = _.mergeWith(a, b, function(a, b) {
if (a.concat) {
return a.concat(b);
}
else {
return b;
}
})
console.log('c', c);
<script src="https://cdn.jsdelivr.net/lodash/4/lodash.min.js"></script>
有没有什么好的方法可以将对象映射到其他对象?也欢迎图书馆推荐。
例如,假设我有这些 类:
export class Draft {
id: number;
name: string;
summary: string;
}
export class Book {
id: number;
name: string;
info: Info;
}
export class Info {
value: string;
}
传统上,要将字段从 Draft
映射到 Book
,我必须为每个字段手动执行此操作:
export class Book {
[...]
fromDraft(Draft draft) {
this.id = draft.id;
this.name = draft.name;
this.info = new Info();
this.info.value = draft.summary;
}
}
是否有更简单的方法来映射以相同方式命名的对象字段?例如 Draft
和 Book
的 id
和 name
字段,同时还能够定义自定义映射,例如从 draft.summary
到 book.info.value
.
请注意,这与我的实际用例相去甚远。在这里手动赋值并没有那么糟糕,但是对于具有许多类似命名字段的对象来说,这是一件很麻烦的事情。
谢谢!
关于复制同名属性,可以使用Object.assign:
fromDraft(Draft draft) {
Object.assign(this, draft);
this.info = new Info();
this.info.value = draft.summary;
}
问题是它也会创建 this.summary
,但这是一种复制属性的便捷方式,因此如果您可以以不同的方式为 类 建模,那么您就可以使用它。
另一种选择是拥有共享 属性 名称的列表,然后对其进行迭代:
const SHARED_NAMES = ["id", "name"];
fromDraft(Draft draft) {
SHARED_NAMES.forEach(name => this[name] = draft[name]);
this.info = new Info();
this.info.value = draft.summary;
}
无论使用 TypeScript,您都可以使用 lodash _.mergeWith
并传递您的合并功能。
优点:更通用(如果你有更多逻辑可以添加它(例如复杂类型)
缺点:你需要lodash
类似于:
var a = {
foo: [1, 2, 3],
bar: true
}
var b = {
foo: [4, 5, 6, 7],
bar: false
}
var c = _.mergeWith(a, b, function(a, b) {
if (a.concat) {
return a.concat(b);
}
else {
return b;
}
})
console.log('c', c);
<script src="https://cdn.jsdelivr.net/lodash/4/lodash.min.js"></script>