什麼是automapper?
之前在用後端語言寫api時,經常遇到如下場景
- 有個物件包含3個屬性,但我僅僅想返回2個屬性給外部,需要隱藏掉1個屬性
- 有個物件包含2個屬性,其中一個屬性是從資料庫或外部api取回的,所以屬性名也是從外部定義的,比如該屬性名為"out_prop1",但是因為我自己API的資料規範,該屬性的值應該賦予返回結果的"prop1"屬性內
上面只是兩個簡單的場景,如今我們API的結果大部分都是JSON結構。API層在返回結果時將資料結果JSON Serialization。
像我之前,API層都資料基本就是從外部API或者資料層獲取(詳見DAO),但是我需要同意處理為符合我API資料規範的資料(詳見DTO),會進行包括上述兩條在內等的操作。 如果每次我都做屬性名稱轉化,刪除屬性等操作,那我就累死了,所以早已有了c#的automapper等強大完善等庫來幫你解決這個問題。javascript是否需要?
個人覺得,大部分時候js其實不需要,因為js語言對object的操作已經非常簡單了。但是現在普遍用nodejs來做API中間層甚至server,也就不可避免地遇到上面的問題。此時有一個統一的可複用的庫來處理是最好不過的。
demo
下面是將prop1的屬性名轉為testprop1
var objA = { prop1: 'From A', prop2: 'From A too' };
let expectedResult = { testprop1: 'From A', prop2: 'From A too' };
AutoMapper.createMap('a', 'b')
.forMember('testprop1', (opts: IMemberConfigurationOptions) => opts.mapFrom('prop1'));
var objB = AutoMapper.map('a', 'b', objA);
// objB = { testprop1: 'prop1', prop2: 'prop2' }
複製程式碼
下面是objA物件的prop2屬性忽略掉
var objA = { prop1: 'prop1', prop2: 'prop2' };
let expectedResult = { prop1: 'prop1' };
AutoMapper.createMap('a', 'b')
.forSourceMember('prop2', (opts: IMemberConfigurationOptions) => opts.ignore());
var objB = AutoMapper.map('a', 'b', objA);
複製程式碼
原始碼github,這是我借鑑了github上一位開發者之前搞得mapper庫(這位大神參考c#的AutoMapper),我也站在這位大神的肩膀上,希望可以加上一些更符合js習慣,更有用的功能。