前言
近來因為工作上的需求,開始面對前端(Angularjs)、後端(C# MVC WebAPI)與預存程序(Stored procedure)介接作業。雖然工作分配以後端與預存程序為主,但與前端介接與測試的過程中,個人會去了解前端程式如何撰寫與如何運作,一方面可以加速介接工作與協助處理問題,另一方面也可以學習前端技術。這次所介紹的三個 function,是因為個人不常撰寫前端,連續三次看到皆需要重新查詢其使用方法,特此學習與紀錄,也提供有興趣的朋友參考,若有錯誤或建議請各位先進不吝提出。copy, extend, and merge. |
介紹
angular.copy
deep copy,完整的將 SourceA 的內容,複製到 DestinationA 中,如下所示:
var SourceA = {'name':'Ina', 'age':'18'}; var DestinationA = {}; angular.copy(SourceA, DestinationA); console.log(DestinationA); //result:{ age: "18", name: "Ina" }
如果 DestinationA 有內容的時候,SourceA 會完全覆蓋 DestinationA 內容,如下所示:
var SourceB = {'name':'Ina', 'age':'18'}; var DestinationB = {'name':'Duran', 'age':'30', 'skill':'program'}; angular.copy(SourceB, DestinationB); console.log(DestinationB); //result:{ age: "18", name: "Ina" }
angular.extend
shallow copy,extend 與 copy 有點類似,但其實很不一樣,如下面範例所示,你會發現與 copy 結果相同:
var SourceC = {'name': 'Ina', 'age' : '18'}; var DestinationC = {}; angular.extend(DestinationC, SourceC); console.log(DestinationC); //result:{ age: "18", name: "Ina" }
但實際上,extend可以有多個來源物件(Source),且後者(Source2)會取代前者(Source1)相同性質內容,如下所示:
var SourceE1 = {'name': 'Ina', 'age' : '18'}; var SourceE2 = {'name': 'Tomaya', 'skill':'swim'}; var DestinationE = {}; angular.extend(DestinationE, SourceE1, SourceE2); console.log(DestinationE); //result:{ age: "18", name: "Tomaya", skill: "swim"}
若 Destination 有內容,也會以取代相同性質,如下所示:
var SourceD = {'name': 'Ina', 'age' : '18'}; var DestinationD = {'name':'Duran', 'age':'30', 'skill':'program'}; angular.extend(DestinationD, SourceD); console.log(DestinationD); //result: { age: "18", name: "Ina", skill: "program" }註:您需要將要保留的資料放置在最後,以避免被取代。
angurlar.merge
deep copy 物件內容,這個1.4+版本以上推出的merge功能,幾乎與 extend 的作用幾乎一模一樣,如下所示
但在相同物件情況下,extend 並不會複製獨立物件內容,如下所示:
var SourceF1 = {'name': 'Ina', 'age' : '18'}; var SourceF2 = {'name': 'Tomaya', 'skill':'swim'}; var DestinationF = {}; angular.merge(DestinationF, SourceF1, SourceF2); console.log(DestinationF); //result:{ age: "18", name: "Tomaya", skill: "swim"}
但在相同物件情況下,extend 並不會複製獨立物件內容,如下所示:
var src1 = { pet: { name: 'Dog', age: 2, weight: 5 } }; var src2 = { pet: { name: 'Cat', age: 3 } }; var dst = {}; console.log(angular.extend(dst, src1, src2)); //result: { pet: { age: 3, name: "Cat" } }
var src1 = { pet: { name: 'Dog', age: 2, weight: 5 } }; var src2 = { pet: { name: 'Cat', age: 3 } }; var dst = {}; console.log(angular.merge(dst, src1, src2)); //result: { pet: { age: 3, name: "Cat", weight: 5 } }您可以參考 http://davidcai.github.io/blog/posts/copy-vs-extend-vs-merge/ ,內有詳細的範例說明。
參考資料
1. AngularJS Documentation2. David Cai | Blog
3. Difference between angular.merge and angular.extend? - StackOverflow
0 留言