में 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.
मेरा मानना है कि शब्दार्थ से उन तरीकों के बारे में सोचना सीखने से आप बेहतर "अनुमान" लगा सकते हैं कि मौजूदा और गैर-मौजूदा मूल्यों के सभी विभिन्न परिदृश्यों के लिए व्यवहार क्या होगा।