में Lodash पुस्तकालय, कर सकते हैं किसी का एक बेहतर विवरण प्रदान मर्ज और विस्तार / असाइन ।
यह एक आसान सवाल है लेकिन जवाब मुझे फिर भी मिलता है।
में Lodash पुस्तकालय, कर सकते हैं किसी का एक बेहतर विवरण प्रदान मर्ज और विस्तार / असाइन ।
यह एक आसान सवाल है लेकिन जवाब मुझे फिर भी मिलता है।
जवाबों:
यहां बताया गया है कि कैसे extend
/ assign
काम करता है: स्रोत में प्रत्येक संपत्ति के लिए, गंतव्य के रूप में इसके मूल्य की प्रतिलिपि बनाएँ। यदि संपत्ति के मूल्य स्वयं वस्तु हैं, तो उनके गुणों का कोई पुनरावृत्ति नहीं है। संपूर्ण वस्तु को स्रोत से लिया जाएगा और गंतव्य के लिए सेट किया जाएगा।
यहां बताया गया है कि कैसे merge
काम करता है: स्रोत में प्रत्येक संपत्ति के लिए, जांचें कि क्या संपत्ति स्वयं वस्तु है। यदि यह फिर से नीचे जा रहा है और स्रोत से गंतव्य तक चाइल्ड ऑब्जेक्ट गुणों को मैप करने का प्रयास करें। इसलिए अनिवार्य रूप से हम ऑब्जेक्ट पदानुक्रम को स्रोत से गंतव्य तक मर्ज करते हैं। के लिए एक ओर जहां extend
/ assign
, यह स्रोत से गंतव्य के लिए संपत्तियों की साधारण एक स्तर प्रति है।
यहाँ सरल JSBin है जो इस क्रिस्टल को स्पष्ट करेगा: http://jsbin.com/uXaqIMa/2/edit?js,console
यहाँ अधिक विस्तृत संस्करण है जिसमें उदाहरण के साथ सरणी भी शामिल है: 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
के लिए एक उपनाम है _.assign
, इसलिए वे समान हैंnull
वही सब संभालते हैं_.defaults
और _.defaultsDeep
दूसरों की तुलना में रिवर्स ऑर्डर में तर्कों को संसाधित करता है (हालांकि पहला तर्क अभी भी लक्ष्य वस्तु है)_.merge
और _.defaultsDeep
बाल वस्तुओं को मर्ज कर देगा और अन्य मूल स्तर पर अधिलेखित हो जाएंगे_.assign
और के _.extend
साथ एक मान को अधिलेखित कर देगाundefined
_.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
संभालता है undefined
लेकिन अन्य इसे छोड़ देंगे_.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
उसी को संभालते हैं_.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
और _.defaultsDeep
बाल वस्तुओं का विलय होगा_.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" }
नोट: जैसा कि @ मिस्टिक ने बताया है, लॉडेज एरेज़ को ऑब्जेक्ट्स के रूप में मानता है, जहाँ कुंजियाँ इंडेक्स हैं।
_.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
के साथ संघर्षOnly _.assign will overwrite a value with undefined
undefined
मूल्यों पर ध्यान देने के लिए एक और अंतर है :
mergeInto = { a: 1}
toMerge = {a : undefined, b:undefined}
lodash.extend({}, mergeInto, toMerge) // => {a: undefined, b:undefined}
lodash.merge({}, mergeInto, toMerge) // => {a: 1, b:undefined}
तो मूल्यों को परिभाषित मूल्यों में merge
विलय नहीं करेगा undefined
।
mergeInto
संपत्तियां थीं जो toMerge
उनके पास नहीं थीं , तो यह उन संपत्तियों को बनाए रखेगा। उस मामले में यह एक क्लोन नहीं होगा।
यह विचार करने में मददगार हो सकता है कि वे शब्दार्थ से क्या करते हैं:
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.
मेरा मानना है कि शब्दार्थ से उन तरीकों के बारे में सोचना सीखने से आप बेहतर "अनुमान" लगा सकते हैं कि मौजूदा और गैर-मौजूदा मूल्यों के सभी विभिन्न परिदृश्यों के लिए व्यवहार क्या होगा।