Js通過deepMerge實(shí)現(xiàn)默認(rèn)配置和自定義配置的合并

Js通過deepMerge實(shí)現(xiàn)默認(rèn)配置和自定義配置的合并

在做自定義配置文件時(shí),為了簡化操作掺喻,通常會采用默認(rèn)配置尼酿,再在此基礎(chǔ)上合并(Merge)用戶自定義配置,且用戶自定義配置會覆蓋對應(yīng)的默認(rèn)配置拯辙,經(jīng)測試發(fā)現(xiàn),使用 deepMerge 庫可以輕松靈活實(shí)現(xiàn)颜价。<font color="red">提示:請確保您的計(jì)算機(jī)安裝了 NodeJS 運(yùn)行環(huán)境涯保。</font>

1 實(shí)現(xiàn)目標(biāo)

通過 defaultConfig 對象默認(rèn)配置值,可以確保在沒有進(jìn)行用戶配置的情況下周伦,系統(tǒng)按照默認(rèn)配置運(yùn)行夕春,使應(yīng)用能夠“開箱即用”,提升用戶體驗(yàn)专挪;當(dāng)用戶需要滿足各種不同需要時(shí)及志,可以通過 userConfig 對象進(jìn)行用戶功能配置,滿足靈活應(yīng)用的需要狈蚤。

2 關(guān)于 deepMerge

2.1 deepMerge 庫相關(guān)介紹

圖1 deepmerge

deepMerge 庫可以通過 npm 安裝困肩。

安裝包的鏈接為:https://www.npmjs.com/package/deepmerge

github 倉庫地址為:https://github.com/TehShrike/deepmerge脆侮。

2.2 deepMerge 的引入

可以在 Shell 里運(yùn)行下面的命令安裝:

npm install deepmerge

安裝完成后可通過下面的 js 代碼引入:

const merge = require('deepmerge')

2.3 deepMerge 基本用法

merge(x, y, [options])

深度合并兩個(gè)對象 x 和 y 锌畸,返回一個(gè)新的合并后的對象,元素來自 x 和 y 靖避, x 和 y 都不會發(fā)生改變潭枣。
注意:上面的 options 是可選項(xiàng),默認(rèn)情況下(即沒有輸入 options 時(shí))幻捏,兩個(gè)對象的數(shù)組會連接起來盆犁。

  • 下面的代碼測試 deepMerge 庫默認(rèn)配置下的效果:
const merge = require('deepmerge')

// 下面定義數(shù)組覆蓋選項(xiàng),當(dāng)要實(shí)現(xiàn)數(shù)組覆蓋的時(shí)候篡九,可以在 merge 時(shí)使用該選項(xiàng)
const overwriteMerge = (destinationArray, sourceArray, options) => sourceArray

let x = {
    a: {
        a1: 'A1',
        a2: 'A2'
    },
    b: {
        b1: ['B1']
    }
}

let y = {
    a: {
        a1: 'A1-new',
        a3: 'created'
    },
    b: {
        b1: ['B2']
    }
}

let z1 = merge(x, y)
console.log('下面采用默認(rèn)選項(xiàng)的 merge 結(jié)果:')
console.log(z1)

let z2 = merge(x, y, { arrayMerge: overwriteMerge })
console.log('下面采用數(shù)組覆蓋選項(xiàng)的 merge 結(jié)果:')
console.log(z2)
  • 得到對象 z 的結(jié)果打印如下:
//下面采用默認(rèn)選項(xiàng)的 merge 結(jié)果:
{
    a: {
        a1: 'A1-new',
        a2: 'A2',
        a3: 'created'
    },
    b: {
        b1: ['B1', 'B2']
    }
}
//下面采用數(shù)組覆蓋選項(xiàng)的 merge 結(jié)果:
{
    a: {
        a1: 'A1-new',
        a2: 'A2',
        a3: 'created'
    },
    b: {
        b1: ['B2']
    }
}
  • 結(jié)果解析
    1)值類型會被覆蓋
    值類型為:字符串(string)谐岁、數(shù)值(number)、布爾值(boolean)、null伊佃、undefined窜司,當(dāng) x,y 對象中有相同的key 對應(yīng)的數(shù)據(jù)類型為值類型時(shí)航揉,值會被覆蓋塞祈,如:
    x.a.a1 = 'A1'
    y.a.a1 = 'A1-new'
    merge的結(jié)果就是 'A1-new' 會覆蓋 'A1',z.a.a1 = 'A1-new'
    2)“左側(cè)”內(nèi)容會保留
    如某鍵在 x (左側(cè))中存在帅涂,在 y(右側(cè)) 中不存在议薪,則 x 的內(nèi)容會被保留,如:x.a.a2 = 'A2', y.a.a2不存在媳友,所以:z.a.a2 = 'A2'( x.a.a2 被保留在 z.a.a2 中)
    3)默認(rèn)配置下引用類型:對象(Object)斯议、數(shù)組(Array)默認(rèn)會合并
    如對象屬性:x.a.a3 不存在,y.a.a3 = 'created'庆锦,y.a.a3的內(nèi)容就被合并到 z 中捅位,z.a.a3 = 'created'
    如數(shù)組元素:x.b.b1 = [ 'B1' ],y.b.b1 = [ 'B2' ]搂抒,此兩項(xiàng)內(nèi)容被合并到 z 中,z.b.b1 = [ 'B1', 'B2' ]
    4)配置數(shù)組屬性覆蓋
    當(dāng)配置數(shù)組屬性覆蓋時(shí)尿扯,在 merge 后的對象 z 里求晶,z.b.b1 的值取 y.b.b1 的值,即z.b.b1= [ 'B2' ]

    3 應(yīng)用測試

    創(chuàng)建 test-merge.js 文件衷笋,編寫代碼如下

    const merge = require('deepmerge')
    

    下面定義數(shù)組覆蓋選項(xiàng)芳杏,當(dāng)要實(shí)現(xiàn)數(shù)組覆蓋的時(shí)候,可以在merge時(shí)使用該選項(xiàng)

    const overwriteMerge = (destinationArray, sourceArray, options) => sourceArray
    

    3.1 defaultConfig 的對象定義

    在 test-merge.js 文件里定義 defaultConfig 對象:

    const defaultConfig={
      title: '模擬考試',
      students: 50,
      subjects: 2,
      subjectList: [ '語文', '數(shù)學(xué)' ]
    }
    

    3.2 userConfig 的對象定義

    在 test-merge.js 文件里定義 userConfig 對象:

    const userConfig={
      title: 'xx年度會考',
      students: 60,
      subjectList: [ '地理', '生物' ]
    }
    

    3.3 deepMerge 合并生成 finalConfig 對象

    一般作為配置文件的合并辟宗,數(shù)組一般會使用覆蓋模式爵赵,繼續(xù)編寫代碼:

    const finalConfig = merge(defaultConfig, userConfig, { arrayMerge: overwriteMerge })
    console.log(finalConfig)
    

    運(yùn)行后得到的結(jié)果為

    { 
      title: 'xx年度會考', 
      students: 60, 
      subjects: 2,
      subjectsList: [ '地理', '生物' ] 
    }
    

    完美實(shí)現(xiàn)默認(rèn)配置和自定義配置的合并。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泊脐,一起剝皮案震驚了整個(gè)濱河市空幻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌容客,老刑警劉巖秕铛,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缩挑,居然都是意外死亡但两,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門供置,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谨湘,“玉大人,你說我怎么就攤上這事〗衾” “怎么了谎僻?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長寓辱。 經(jīng)常有香客問我艘绍,道長,這世上最難降的妖魔是什么秫筏? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任诱鞠,我火速辦了婚禮,結(jié)果婚禮上这敬,老公的妹妹穿的比我還像新娘航夺。我一直安慰自己,他們只是感情好崔涂,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布阳掐。 她就那樣靜靜地躺著,像睡著了一般冷蚂。 火紅的嫁衣襯著肌膚如雪缭保。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天蝙茶,我揣著相機(jī)與錄音艺骂,去河邊找鬼。 笑死隆夯,一個(gè)胖子當(dāng)著我的面吹牛钳恕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蹄衷,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼忧额,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了愧口?” 一聲冷哼從身側(cè)響起睦番,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎调卑,沒想到半個(gè)月后抡砂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恬涧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年注益,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溯捆。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡丑搔,死狀恐怖厦瓢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情啤月,我是刑警寧澤煮仇,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站谎仲,受9級特大地震影響浙垫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜郑诺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一夹姥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辙诞,春花似錦辙售、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至较店,卻和暖如春士八,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背泽西。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工曹铃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捧杉。 一個(gè)月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像秘血,于是被迫代替她去往敵國和親味抖。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容