লোড্যাশ - .extend () / .assign () এবং। विसর () এর মধ্যে পার্থক্য


উত্তর:


582

কীভাবে extend/ assignকাজ করে তা এখানে : উত্স অনুসারে প্রতিটি সম্পত্তির জন্য, এর মানটিকে গন্তব্যে অনুলিপি করুন। যদি সম্পত্তি মানগুলি নিজেরাই বস্তু হয় তবে তাদের সম্পত্তিগুলির কোনও পুনরাবৃত্ত ট্র্যাভার্সাল নেই। সম্পূর্ণ অবজেক্ট উত্স থেকে নেওয়া হবে এবং গন্তব্য সেট করা হবে।

কীভাবে এটি mergeকাজ করে তা এখানে : উত্স অনুসারে প্রতিটি সম্পত্তির জন্য, সেই সম্পত্তিটি নিজেই আপত্তিজনক কিনা তা পরীক্ষা করে দেখুন। যদি তা হয় তবে পুনরাবৃত্তির সাথে নেমে আসুন এবং উত্স থেকে গন্তব্যে চাইল্ড অবজেক্টের বৈশিষ্ট্য ম্যাপ করার চেষ্টা করুন। সুতরাং মূলত আমরা উত্স থেকে শ্রেণিবিন্যাসকে উত্স থেকে গন্তব্যে মার্জ করি। extend/ এর জন্য থাকাকালীন assignএটি উত্স থেকে গন্তব্যে সম্পত্তিগুলির এক স্তরের অনুলিপি।

এখানে সহজ জেএসবিন যা এই স্ফটিকটিকে পরিষ্কার করবে: http://jsbin.com/uXaqIMa/2/edit?js,console

এখানে আরও বিস্তৃত সংস্করণ যা উদাহরণটিতে অ্যারে অন্তর্ভুক্ত রয়েছে: http://jsbin.com/uXaqIMa/1/edit?js,console


16
একটি গুরুত্বপূর্ণ পার্থক্য বলে মনে হচ্ছে _ _ নিমজ্জন একটি নতুন মার্জ করা বস্তু ফেরত দেওয়ার সময় _ _ এক্সটেনড গন্তব্য অবজেক্টটিকে জায়গায় জায়গায়
রূপান্তরিত করে

69
তারা উভয়ই ফিরে আসে তা নির্বিশেষে গন্তব্য অবজেক্টটিকে রূপান্তরিত করতে উপস্থিত হয়।
জেসন রাইস

7
এটিও উপস্থিত হয় যে _ গন্তব্য অবজেক্টের ক্লোবার্স সদস্যরা যদি উত্স অবজেক্টে উপস্থিত না থাকে তবে এটি আমার জন্য অবাক হয়।
জেসন রাইস

5
পছন্দ করেছেন উদাহরণস্বরূপ এই ঝাঁকুনিতে, "একটি" বৈশিষ্ট্য আঁটসাঁট করে না । এটি সত্য যে প্রসারিত হওয়ার পরে, ভাগ্য ["পি"] ["y"] এর আর অস্তিত্ব থাকবে না - এটি কারণ কারণ প্রসারিত এসসিআর এবং ডেস্ট উভয়ের "পি" সম্পত্তি ছিল, তাই ডেস্টের "পি" সম্পত্তি সম্পূর্ণরূপে ওভাররাইট হয়ে যায় src এর "p" সম্পত্তি দ্বারা (তারা এখন ঠিক একই জিনিস)।
কেভিন হুইলার

14
পরিষ্কার হতে, উভয় পদ্ধতিই রেফারেন্সের মাধ্যমে প্রথম যুক্তিকে সংশোধন / ওভাররাইট করে । সুতরাং আপনি যদি ফলাফলের মার্জ থেকে কোনও নতুন অবজেক্ট চান তবে কোনও বস্তুর আক্ষরিক পাস করা ভাল। var combined = merge({}, src, dest)
জোন জ্যাকস

534

লোড্যাশ সংস্করণ 3.10.1

পদ্ধতিগুলি তুলনা করা

  • _.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" }

অ্যারেতে প্রত্যাশার মতো কেউই সত্যই কাজ করে না

দ্রষ্টব্য: @ মিস্টিক হিসাবে উল্লেখ করা হয়েছে যে লোডাশ অ্যারেগুলিকে অ্যারেগুলিতে সূচি হিসাবে চিহ্নিত করা হয় objects

_.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"  ]

31
এটি আসলে অ্যারেগুলিকে ঠিক যেমন মার্জ করে বস্তুগুলিকে মার্জ করে, কারণ অ্যারেগুলি সংখ্যাসূচক কীযুক্ত বস্তু। আমি সম্মত হই যে কেউ ব্যবহারের উপর নির্ভর করে অ্যারেগুলি একত্রিত করতে বা প্রতিস্থাপন করতে পারে।
মিস্টিক

11
দুর্দান্ত উত্তর। পরীক্ষাগুলি খুব যুক্তিযুক্ত ছিল :-)
লুসিও পাইভা

5
_.extend is an alias for _.assign, so they are identicalসাথে বিরোধগুলিOnly _.assign will overwrite a value with undefined
চ্যাজটি 3

9
ভি ৪.০ হিসাবে, _.একসেট এখন _এসাইনইন-এর একটি নাম, _সাইন নয়। এসাইনআইএন ফাংশন উত্তরাধিকারসূত্রে প্রাপ্ত বৈশিষ্ট্যগুলির সাথে লেনদেন যুক্ত করে।
মাইক হেডম্যান

2
এখানে কি শোধন করা হবে না?
সি_বি

75

মনোযোগ দেওয়ার আরেকটি পার্থক্য হ'ল 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


3
এটি কি আমি বা লডাশ.এটি সম্পূর্ণরূপে অকেজো করে তোলে যে এটি সর্বদা 'টো মার্জ' অবজেক্টের ক্লোন ফিরিয়ে দেয়?
জেসন রাইস

6
যদি mergeIntoএমন বৈশিষ্ট্য ছিল যা toMergeনা থাকে তবে এটি সেই বৈশিষ্ট্যগুলি ধরে রাখতে পারে। সেক্ষেত্রে এটি কোনও ক্লোন হবে না।
ডেভিড নিলে

1
@ জেসন রাইস খালি remove remove অপসারণ করবে এবং এটি এটিকে স্থানান্তর করবে লডাশ.ব্রিজ (মার্জইনটো, টু মার্জ)
সিডোনাল্ডসন

20

সিনেমিক দৃষ্টিকোণ থেকে তারা কী করে তা বিবেচনা করাও সহায়ক হতে পারে:

_.assign

   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.

_.defaultsDeep

   works like _defaults but like merge will not simply copy objects
   and will use recursion instead.

আমি বিশ্বাস করি যে শব্দাবলীর দৃষ্টিকোণ থেকে সেগুলি সম্পর্কে ভাবতে শেখা আপনাকে বিদ্যমান এবং অ-বিদ্যমান মানের সমস্ত ভিন্ন পরিস্থিতিতে কী আচরণ করবে তা ভালভাবে "অনুমান" করতে দেয়।


3

আপনি যদি একই objরেফারেন্স ধরে রেখে ওভাররাইড ছাড়াই একটি গভীর অনুলিপি চান

obj = _.assign(obj, _.merge(obj, [source]))

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.