實現物件合併功能

2022-05-14 10:06:47 字數 1853 閱讀 5946

前言

jquery 中的 $.extend() 是經常使用到工具函式,多用於合併引數(物件),具體用法在這裡不過多贅述,可通過傳參控制合併過程中是否使用深度拷貝;而es2015中新增的 object.assign()方法,也可以實現物件的合併,不過合併過程中使用的是淺拷貝;本文參考了jquery的extend方法的原始碼,將自己實現物件合併,即將多個物件的屬性複製到目標物件上,若有相同的屬性,後面的物件覆蓋前面的。

之前的一篇博文 有專門介紹物件和陣列的深淺拷貝,不了解的童鞋請移步。先看實現再解釋

function extend() ;  //

取目標物件

if(['object','function'].indexof(typeof target) < 0);

}for(;i),,)

for(name in options)}}

}return

target }//

測試資料

var test1 =,

e : [1,'a']

},test2 =,

e : [1,'a'],

g : 7}

var test =extend({},test1,test2);

console.log(test.b.d); //5

test2.b.d = 'x'; //

修改test2

console.log(test.b.d); //

'x' test隨之修改

思路如下:

1、預設取第乙個引數為目標物件,若第乙個引數非物件資料型別,則賦值為空物件

2、遍歷剩下的引數(源物件),將源物件的屬性複製到目標物件上 。

3、返回目標物件為合併的結果

在第二步中沒有對源物件的屬性值進行判斷,所有的全部使用 『=』 賦值,所以當源物件的屬性值為物件屬性時,複製的只是引用值,即為淺拷貝的方式,在測試結果中可以看出 test 和 test2 的 b 屬性的屬性值,使用的是同乙個物件,會互相影響。知道了這些之後,如何實現合併時的深拷貝也應該有思路了。

需要在複製源物件屬性值時,判斷值的型別,如果是物件資料型別,則遞迴呼叫extend函式。則可以實習深拷貝方式的物件合併,實現如下:

function extend() ;

//如果第乙個引數為boolean型別,賦值給deep

if(typeof target == 'boolean'); //

目標物件順延

i++;

}//如果target不是物件資料型別的話 target賦值為 {}

if(['object','function'].indexof(typeof target) < 0);

}for(;i)

if(deep && copy && (typeof copy == 'object')); //

區分陣列和『物件』

target[name] =extend(deep,src,copy);

}else}}

}}

return

target

}

1、引數判斷,若第乙個引數為布林型別,則取為控制是否深度拷貝的引數deep , deep 預設為false;同時 目標元素會是第二個引數

2、複製屬性值時,要判斷deep引數和 屬性值的型別 ; 若 deep為true 且 屬性值為物件型別 則遞迴呼叫 extend函式 , 否則直接賦值

3、需要區分 陣列 和 『物件』 ,來給 目標物件的屬性賦值不同的初始值。如果都是 {} 的話,陣列型別的屬性值複製到目標元素上會變為

一直都是在直接使用 $.extend(),好用但是不是很清楚其中的實現,自己擼一擼,也許實現上還有不嚴謹的地方,但是覺得收穫還是不錯的。

extend 實現物件合併

概述 用乙個或多個其它物件來擴充套件乙個物件,返回被擴充套件的物件。引數引數 說明deep 如果為 true,則深拷貝,預設淺拷貝。target 待修改的物件 object1 待合併到第乙個物件的物件 objectn 待合併到第乙個物件的物件 示例 目的 合併 obj1 和 obj2,修改並返回 o...

wpf中xps文件合併功能實現

原文 wpf中xps文件合併功能實現 如果要是直接先開啟乙個xps檔案,用新檔案去寫fixeddocument,或者documentsequence 新增到新的檔案中的話,會報錯,提示,system.windows.xps.xpspackagingexception 型別的未經處理的異常在 reac...

js 實現 多層級物件合併

需求是使用js對資料的格式進行轉換 把乙個二維陣列 包含層級資訊,層級數是不固定的 list 轉換為多層級的物件 我的思路就是 迴圈先把list裡單條資訊轉換為 多層級物件 然後和上一條 進行合併 原資料型別 分別轉換為 a a b 最終合併效果 a2 b onsubmit void 存放的原始資料...