Trong thư viện Lodash , ai đó có thể cung cấp một lời giải thích tốt hơn về hợp nhất và mở rộng / gán .
Đó là một câu hỏi đơn giản nhưng dù sao câu trả lời vẫn lảng tránh tôi.
Trong thư viện Lodash , ai đó có thể cung cấp một lời giải thích tốt hơn về hợp nhất và mở rộng / gán .
Đó là một câu hỏi đơn giản nhưng dù sao câu trả lời vẫn lảng tránh tôi.
Câu trả lời:
Dưới đây là cách extend
/ assign
hoạt động: Đối với mỗi thuộc tính trong nguồn, hãy sao chép giá trị của nó như là đích đến. nếu bản thân các giá trị thuộc tính là các đối tượng, thì không có giao thức đệ quy của các thuộc tính của chúng. Toàn bộ đối tượng sẽ được lấy từ nguồn và đặt vào đích.
Đây là cách merge
hoạt động: Đối với mỗi thuộc tính trong nguồn, hãy kiểm tra xem thuộc tính đó có phải là đối tượng không. Nếu đó là đi xuống đệ quy và cố gắng ánh xạ các thuộc tính đối tượng con từ nguồn đến đích. Vì vậy, về cơ bản chúng tôi hợp nhất hệ thống phân cấp đối tượng từ nguồn đến đích. Trong khi cho extend
/ assign
, nó đơn giản là một bản sao thuộc tính từ nguồn đến đích.
Đây là một JSBin đơn giản sẽ làm cho tinh thể này rõ ràng: http://jsbin.com/uXaqIMa/2/edit?js,console
Đây là phiên bản phức tạp hơn bao gồm cả mảng trong ví dụ: http://jsbin.com/uXaqIMa/1/edit?js,console
var combined = merge({}, src, dest)
_.merge(object, [sources], [customizer], [thisArg])
_.assign(object, [sources], [customizer], [thisArg])
_.extend(object, [sources], [customizer], [thisArg])
_.defaults(object, [sources])
_.defaultsDeep(object, [sources])
_.extend
là một bí danh cho _.assign
, vì vậy chúng giống hệt nhaunull
như nhau_.defaults
và _.defaultsDeep
xử lý các đối số theo thứ tự ngược lại so với các đối số khác (mặc dù đối số đầu tiên vẫn là đối tượng đích)_.merge
và _.defaultsDeep
sẽ hợp nhất các đối tượng con và các đối tượng khác sẽ ghi đè lên ở cấp gốc_.assign
và _.extend
sẽ ghi đè lên một giá trị vớiundefined
_.assign ({}, { a: 'a' }, { a: 'bb' }) // => { a: "bb" }
_.merge ({}, { a: 'a' }, { a: 'bb' }) // => { a: "bb" }
_.defaults ({}, { a: 'a' }, { a: 'bb' }) // => { a: "a" }
_.defaultsDeep({}, { a: 'a' }, { a: 'bb' }) // => { a: "a" }
_.assign
xử lý undefined
nhưng những người khác sẽ bỏ qua nó_.assign ({}, { a: 'a' }, { a: undefined }) // => { a: undefined }
_.merge ({}, { a: 'a' }, { a: undefined }) // => { a: "a" }
_.defaults ({}, { a: undefined }, { a: 'bb' }) // => { a: "bb" }
_.defaultsDeep({}, { a: undefined }, { a: 'bb' }) // => { a: "bb" }
null
như nhau_.assign ({}, { a: 'a' }, { a: null }) // => { a: null }
_.merge ({}, { a: 'a' }, { a: null }) // => { a: null }
_.defaults ({}, { a: null }, { a: 'bb' }) // => { a: null }
_.defaultsDeep({}, { a: null }, { a: 'bb' }) // => { a: null }
_.merge
và _.defaultsDeep
sẽ hợp nhất các đối tượng con_.assign ({}, {a:{a:'a'}}, {a:{b:'bb'}}) // => { "a": { "b": "bb" }}
_.merge ({}, {a:{a:'a'}}, {a:{b:'bb'}}) // => { "a": { "a": "a", "b": "bb" }}
_.defaults ({}, {a:{a:'a'}}, {a:{b:'bb'}}) // => { "a": { "a": "a" }}
_.defaultsDeep({}, {a:{a:'a'}}, {a:{b:'bb'}}) // => { "a": { "a": "a", "b": "bb" }}
_.assign ({}, {a:['a']}, {a:['bb']}) // => { "a": [ "bb" ] }
_.merge ({}, {a:['a']}, {a:['bb']}) // => { "a": [ "bb" ] }
_.defaults ({}, {a:['a']}, {a:['bb']}) // => { "a": [ "a" ] }
_.defaultsDeep({}, {a:['a']}, {a:['bb']}) // => { "a": [ "a" ] }
a={a:'a'}; _.assign (a, {b:'bb'}); // a => { a: "a", b: "bb" }
a={a:'a'}; _.merge (a, {b:'bb'}); // a => { a: "a", b: "bb" }
a={a:'a'}; _.defaults (a, {b:'bb'}); // a => { a: "a", b: "bb" }
a={a:'a'}; _.defaultsDeep(a, {b:'bb'}); // a => { a: "a", b: "bb" }
Lưu ý: Như @Mistic đã chỉ ra, Lodash coi các mảng là các đối tượng trong đó các khóa là chỉ mục vào mảng.
_.assign ([], ['a'], ['bb']) // => [ "bb" ]
_.merge ([], ['a'], ['bb']) // => [ "bb" ]
_.defaults ([], ['a'], ['bb']) // => [ "a" ]
_.defaultsDeep([], ['a'], ['bb']) // => [ "a" ]
_.assign ([], ['a','b'], ['bb']) // => [ "bb", "b" ]
_.merge ([], ['a','b'], ['bb']) // => [ "bb", "b" ]
_.defaults ([], ['a','b'], ['bb']) // => [ "a", "b" ]
_.defaultsDeep([], ['a','b'], ['bb']) // => [ "a", "b" ]
_.extend is an alias for _.assign, so they are identical
xung đột vớiOnly _.assign will overwrite a value with undefined
Một điểm khác biệt cần chú ý là xử lý các undefined
giá trị:
mergeInto = { a: 1}
toMerge = {a : undefined, b:undefined}
lodash.extend({}, mergeInto, toMerge) // => {a: undefined, b:undefined}
lodash.merge({}, mergeInto, toMerge) // => {a: 1, b:undefined}
Vì vậy, merge
sẽ không hợp nhất undefined
các giá trị thành các giá trị được xác định.
mergeInto
có các thuộc tính toMerge
không có thì nó sẽ giữ lại các thuộc tính đó. Trong trường hợp đó, nó sẽ không phải là một bản sao.
Nó cũng có thể hữu ích để xem xét những gì họ làm từ quan điểm ngữ nghĩa:
will assign the values of the properties of its second parameter and so on,
as properties with the same name of the first parameter. (shallow copy & override)
merge is like assign but does not assign objects but replicates them instead.
(deep copy)
provides default values for missing values.
so will assign only values for keys that do not exist yet in the source.
works like _defaults but like merge will not simply copy objects
and will use recursion instead.
Tôi tin rằng việc học cách nghĩ về các phương pháp đó theo quan điểm ngữ nghĩa sẽ cho phép bạn "đoán" tốt hơn hành vi của tất cả các kịch bản khác nhau của các giá trị hiện tại và không tồn tại.