干净的方式来映射对象到其他对象?
有没有一种将对象映射到其他对象的好方法?图书馆建议也欢迎。干净的方式来映射对象到其他对象?
例如,说我有这些类:
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
。
请注意,这远离我的实际使用情况。这里手动分配并不难,但对于具有许多类似命名字段的对象来说,这相当麻烦。
谢谢!
无论打字稿,你可以使用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>
有趣的图书馆,谢谢!这实际上正是我想到的那种映射器/合并器! – mintychai
我的荣幸:)祝你好运! –
至于抄袭同名的属性,你可以使用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;
}
真的不确定你的问题是什么意思,但是你能不能简单地将'Book'和'Draft'抽象成共享公共字段的更一般的父类,并且从那个父类中扩展?或者,您可以使用[装饰器](https://tc39.github.io/proposal-decorators/)。 – d4nyll
这可能是一个选项,谢谢! – mintychai