2017-07-17 69 views
2

有没有一种将对象映射到其他对象的好方法?图书馆建议也欢迎。干净的方式来映射对象到其他对象?

例如,说我有这些类:

export class Draft { 
    id: number; 
    name: string; 
    summary: string; 
} 

export class Book { 
    id: number; 
    name: string; 
    info: Info; 
} 

export class Info { 
    value: string; 
} 

传统上,映射来自DraftBook领域我不得不每场人工手动操作:

export class Book { 
    [...] 

    fromDraft(Draft draft) { 
     this.id = draft.id; 
     this.name = draft.name; 
     this.info = new Info(); 
     this.info.value = draft.summary; 
    } 
} 

有映射以相同方式命名的对象字段的更简单方法?例如DraftBookidname字段,同时也能够定义自定义映射,如从draft.summarybook.info.value

请注意,这远离我的实际使用情况。这里手动分配并不难,但对于具有许多类似命名字段的对象来说,这相当麻烦。

谢谢!

+0

真的不确定你的问题是什么意思,但是你能不能简单地将'Book'和'Draft'抽象成共享公共字段的更一般的父类,并且从那个父类中扩展?或者,您可以使用[装饰器](https://tc39.github.io/proposal-decorators/)。 – d4nyll

+0

这可能是一个选项,谢谢! – mintychai

回答

1

无论打字稿,你可以使用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>

http://jsbin.com/xugujon/edit?html,js

+0

有趣的图书馆,谢谢!这实际上正是我想到的那种映射器/合并器! – mintychai

+0

我的荣幸:)祝你好运! –

1

至于抄袭同名的属性,你可以使用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; 
}