JavaScript實(shí)現(xiàn)JSON合并操作示例【遞歸深度合并】
本文實(shí)例講述了JavaScript實(shí)現(xiàn)JSON合并操作。分享給大家供大家參考,具體如下:
為什么我會想到寫這幾行代碼
在實(shí)際工作中,我們會使用許多或自主開發(fā)或第三方的工具,有些工具的配置文件相當(dāng)細(xì)節(jié),使用頻率低倒也罷了,使用頻率高的話必然造成很多代碼冗余。所以我都會對這些工具做二次封裝,把不經(jīng)常改動的配置給予默認(rèn)值。如果需要改動,傳入新的配置覆蓋原來的配置即可。
起初我以為這是一項(xiàng)很簡單的需求
var json1 = { // 固定的配置 a: 1, b: 2, c: 3, } var json2 = { // 作為參數(shù)傳入的配置 a: 11, d: 14, } json3 = { // 合并后的結(jié)果 a: 11, b: 2, c: 3, d: 14, }
如上述,確實(shí)很簡單??墒聦?shí)是,當(dāng)配置不再是僅僅一層嵌套時,常用的合并如$.extend
,for in
賦值就不再能再解決問題了
var json1 = { a: 1, b: { b1: 'hello', b2: 'world', }, } var json2 = { b: { b2: 'china' }, c: 3, } json3 = { // 合并后的結(jié)果 a: 1, b: { b2: 'chila' }, c: 3, }
可以看出,我們的本意是希望json2里的b.b2: 'china'取代json1里的b.b2: 'world', 可是實(shí)際上,常規(guī)的結(jié)果只會把整個object/json取代,而不會去遍歷其中的屬性,在本例中導(dǎo)致了b.b1的丟失。
于是就有了如下幾行代碼:
// 遇到相同元素級屬性,以后者(main)為準(zhǔn) // 不返還新Object,而是main改變 function mergeJSON (minor, main) { for (var key in minor) { if (main[key] === undefined) { // 不沖突的,直接賦值 main[key] = minor[key]; continue; } // 沖突了,如果是Object,看看有么有不沖突的屬性 // 不是Object 則以main為主,忽略即可。故不需要else if (isJSON(minor[key])) { // arguments.callee 遞歸調(diào)用,并且與函數(shù)名解耦 arguments.callee(minor[key], main[key]); } } } // 附上工具 function isJSON(target) { return typeof target == "object" && target.constructor == Object; }
雖然只有十幾行的代碼,但還是挺實(shí)用。粗略的挖掘了一下搜索引擎,好像并沒有更合適解決問題的代碼。簡單的遞歸思想和argument.callee琢磨一下也是有些味道的
PS:這里再為大家推薦幾款相關(guān)的json在線工具供大家參考:
在線JSON代碼檢驗(yàn)、檢驗(yàn)、美化、格式化工具:
http://tools.jb51.net/code/json
JSON在線格式化工具:
http://tools.jb51.net/code/jsonformat
在線XML/JSON互相轉(zhuǎn)換工具:
http://tools.jb51.net/code/xmljson
json代碼在線格式化/美化/壓縮/編輯/轉(zhuǎn)換工具:
http://tools.jb51.net/code/jsoncodeformat
在線json壓縮/轉(zhuǎn)義工具:
http://tools.jb51.net/code/json_yasuo_trans
更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專題:《JavaScript中json操作技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
Flex通過JS獲取客戶端IP和計(jì)算機(jī)名的實(shí)例代碼
這篇文章主要介紹了Flex通過JS獲取客戶端IP和計(jì)算機(jī)名的實(shí)例代碼,有需要的朋友可以參考一下2013-11-11微信小程序?qū)崿F(xiàn)搜索指定景點(diǎn)周邊美食、酒店
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)搜索指定景點(diǎn)周邊美食、酒店的功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05一個JavaScript遞歸實(shí)現(xiàn)反轉(zhuǎn)數(shù)組字符串的實(shí)例
這篇文章主要介紹了一個JavaScript遞歸實(shí)現(xiàn)反轉(zhuǎn)數(shù)組字符串的實(shí)例,很不錯,非常適合新手朋友們2014-10-10淺談js控制li標(biāo)簽排序問題 js調(diào)用php函數(shù)的方法
下面小編就為大家?guī)硪黄獪\談js控制li標(biāo)簽排序問題 js調(diào)用php函數(shù)的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10JavaScript結(jié)合Bootstrap仿微信后臺多圖文界面管理
這篇文章主要為大家詳細(xì)介紹了js結(jié)合Bootstrap仿微信后臺多圖文界面管理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-07-07JSON.parse損壞大數(shù)字的原因解析及解決方案
從10多年前JSON在線編輯器的早期開始,用戶經(jīng)常反映編輯器有時會破壞他們JSON文檔中的大數(shù)字的問題,這篇文章主要介紹了為什么JSON.parse會損壞大數(shù)字,如何解決這個問題,需要的朋友可以參考下2022-10-10Layui數(shù)據(jù)表格跳轉(zhuǎn)到指定頁的實(shí)現(xiàn)方法
今天小編就為大家分享一篇Layui數(shù)據(jù)表格跳轉(zhuǎn)到指定頁的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09