2017-07-17 93 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; 
}