আমি কীভাবে দুটি জাভাস্ক্রিপ্ট অবজেক্টের বৈশিষ্ট্যকে গতিশীলভাবে মার্জ করতে পারি?


2515

রানটাইমের সময় আমার দুটি (খুব সাধারণ) জাভাস্ক্রিপ্ট অবজেক্ট মার্জ করতে সক্ষম হওয়া দরকার। উদাহরণস্বরূপ আমি করতে চাই:

var obj1 = { food: 'pizza', car: 'ford' }
var obj2 = { animal: 'dog' }

obj1.merge(obj2);

//obj1 now has three properties: food, car, and animal

কারও কাছে কি এর জন্য কোনও স্ক্রিপ্ট আছে বা এটির জন্য বিল্ট সম্পর্কে জেনেছেন? আমার পুনরাবৃত্তি দরকার নেই এবং আমাকে সমতল বস্তুগুলিতে কেবল পদ্ধতিতে ফাংশনগুলি মার্জ করার দরকার নেই।


একটি অনুরূপ প্রশ্নের উপর এই উত্তরটি মূল্যবান , এটি দেখায় যে কীভাবে "এক স্তর নীচে" মার্জ করা যায়। এটি হ'ল এটি সদৃশ কীগুলির মানগুলিকে একত্রিত করে (দ্বিতীয় মানের সাথে প্রথম মানকে ওভাররাইট করার পরিবর্তে), তবে এর চেয়ে পুনরাবৃত্তি করে না। আইএমএইচও, সেই কাজের জন্য এটির ভাল ক্লিন কোড।
টুলমেকারস্টেভ

বিটিডাব্লু, শীর্ষ কয়েকটি উত্তর একটি "অগভীর" সংশ্লেষ করতে পারে: যদি একই কী দু'এজেক্ট 1 এবং আপজেক্ট 2 উভয়টিতে উপস্থিত থাকে তবে অজেক্ট 2 এর মান রাখা হবে, ওজেক্ট 1 এর মান বাদ দেওয়া হবে। উদাহরণস্বরূপ, যদি প্রশ্নের উদাহরণ থাকে var obj2 = { animal: 'dog', food: 'bone' };তবে মার্জ হবে { food: 'bone', car: 'ford', animal: 'dog' }। আপনি যদি "নেস্টেড ডেটা" নিয়ে কাজ করছেন, এবং একটি "গভীর সংশ্লেষ" চান, তবে এমন উত্তরগুলি সন্ধান করুন যেখানে "গভীর সংশ্লেষ" বা "পুনরাবৃত্তি" উল্লেখ রয়েছে। আপনার যদি মানগুলি থাকে তবে তা এখানেarrays বর্ণিত হিসাবে গিথুব "তেহশ্রাইক / গভীর নিমজ্জন" এর "অ্যারেমার্জ" বিকল্পটি ব্যবহার করুন
টুলমেকারস্টেভ

দয়া করে নীচের লিঙ্কটি অনুসরণ করুন stackoverflow.com/questions/171251/… স্প্রেড অপারেটর যা ES6 সংস্করণে নতুন বৈশিষ্ট্য
Dev216

উত্তর:


2903

ECMAScript 2018 মানক পদ্ধতি Meth

আপনি অবজেক্ট স্প্রেড ব্যবহার করবেন :

let merged = {...obj1, ...obj2};

mergedএখন ইউনিয়নের obj1এবং obj2। মধ্যে প্রোপার্টি obj2যাদের ওভাররাইট করবে obj1

/** There's no limit to the number of objects you can merge.
 *  Later properties overwrite earlier properties with the same name. */
const allRules = {...obj1, ...obj2, ...obj3};

এই সিনট্যাক্সের জন্য এখানে MDN ডকুমেন্টেশনও রয়েছে । আপনি যদি ব্যাবেল ব্যবহার করছেন তবে আপনার বাবেল-প্লাগ-ইন-ট্রান্সফর্ম-অবজেক্ট-বিশ্রামের প্রসারণ প্রয়োজন প্লাগইন প্রয়োজন।

ECMAScript 2015 (ES6) মানক পদ্ধতি

/* For the case in question, you would do: */
Object.assign(obj1, obj2);

/** There's no limit to the number of objects you can merge.
 *  All objects get merged into the first object. 
 *  Only the object in the first argument is mutated and returned.
 *  Later properties overwrite earlier properties with the same name. */
const allRules = Object.assign({}, obj1, obj2, obj3, etc);

( MDN জাভাস্ক্রিপ্ট রেফারেন্স দেখুন )


ইএস 5 এবং এর আগের পদ্ধতি

for (var attrname in obj2) { obj1[attrname] = obj2[attrname]; }

লক্ষ্য করুন এই কেবল সব বৈশিষ্ট্যাবলী যোগ করা হবে obj2থেকে obj1যা আপনি এখনও অপরিবর্তিত ব্যবহার করতে চান নাও হতে পারে কি আপনি চান obj1

যদি আপনি এমন একটি ফ্রেমওয়ার্ক ব্যবহার করেন যা আপনার প্রোটোটাইপগুলিতে ছড়িয়ে পড়ে তবে আপনাকে যেমন চেকগুলি দিয়ে ফ্যানসিয়ার পেতে hasOwnPropertyহবে তবে সেই কোডটি 99% ক্ষেত্রে কাজ করবে।

ফাংশন উদাহরণ:

/**
 * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1
 * @param obj1
 * @param obj2
 * @returns obj3 a new object based on obj1 and obj2
 */
function merge_options(obj1,obj2){
    var obj3 = {};
    for (var attrname in obj1) { obj3[attrname] = obj1[attrname]; }
    for (var attrname in obj2) { obj3[attrname] = obj2[attrname]; }
    return obj3;
}

90
যদি বস্তুগুলির একই নামের বৈশিষ্ট্য থাকে তবে এটি কাজ করে না এবং আপনি বৈশিষ্ট্যগুলিকে মার্জ করতেও চান।
Xiè Jìléi

69
এটি কেবল অগভীর অনুলিপি / মার্জ করে। অনেকগুলি উপাদান ক্লোবারের সম্ভাবনা রয়েছে।
জে টেলর

45
+1 স্বীকার করার জন্য যে কিছু দরিদ্র
প্রাণীরা

4
এটি আমার পক্ষে কার্যকর হয়নি কারণ "সুতরাং এটি নতুন বৈশিষ্ট্যগুলি অনুলিপি করা বা সংজ্ঞায়িত করার বিপরীতে বৈশিষ্ট্যগুলি বরাদ্দ করে the এটি একীভূত উত্সগুলিতে যদি সংযোজনকারী থাকে তবে নতুন বৈশিষ্ট্যগুলিকে প্রোটোটাইপে মার্জ করার পক্ষে এটি উপযুক্ত নয়" " ( ডেভেলপার.মোজিলা.আর.ইন- ইউএস / ডকস / ওয়েবে / জাভা স্ক্রিপ্ট / রেফারেন্স / ))। আমাকে ব্যবহার করতে হয়েছিল var merged = {...obj1, ...obj2}
মুরগলার

2
@ জিয়েভ{...obj1, ...{animal: 'dog'}}
ব্যাকস্ল্যাশ

1190

jQuery এরও এর একটি ইউটিলিটি রয়েছে: http://api.jquery.com/jQuery.extend/

JQuery ডকুমেন্টেশন থেকে নেওয়া:

// Merge options object into settings object
var settings = { validate: false, limit: 5, name: "foo" };
var options  = { validate: true, name: "bar" };
jQuery.extend(settings, options);

// Now the content of settings object is the following:
// { validate: true, limit: 5, name: "bar" }

উপরের কোডটি বিদ্যমান বস্তুর নামের পরিবর্তিত হবে settings


আপনি যদি কোনও যুক্তি সংশোধন না করেই কোনও নতুন অবজেক্ট তৈরি করতে চান তবে এটি ব্যবহার করুন:

var defaults = { validate: false, limit: 5, name: "foo" };
var options = { validate: true, name: "bar" };

/* Merge defaults and options, without modifying defaults */
var settings = $.extend({}, defaults, options);

// The content of settings variable is now the following:
// {validate: true, limit: 5, name: "bar"}
// The 'defaults' and 'options' variables remained the same.

166
সতর্কতা: যদিও পরিবর্তনশীল "সেটিংস" পরিবর্তন করা হবে। jQuery একটি নতুন উদাহরণ ফিরে আসে না। এর (এবং নামকরণের জন্য) কারণটি হ'ল। আপনি যদি কোনও নতুন অবজেক্ট চান (যেমন সেটিংস ডিফল্ট হিসাবে আপনি স্পর্শ করতে চান না), আপনি সর্বদা jQuery.extend (settings}, সেটিংস, বিকল্পগুলি) করতে পারেন;
ওয়েবম্যাট 16

1
ঠিক! একটি গুচ্ছ ধন্যবাদ। পূর্ববর্তী মন্তব্য হিসাবে এটি খারাপ নামকরণ করা হয়েছে। আমি jQuery ডক্স পিছনে এবং চতুর্থ অনুসন্ধান করেছি এবং এটিতে চালিত হয়নি।
মাইক স্টারভ

28
মনে মনে, jQuery.extend এছাড়াও একটি গভীর (বুলিয়ান) সেটিং আছে। jQuery.extend(true,settings,override), যা গুরুত্বপূর্ণ যদি সেটিংসে কোনও সম্পত্তি একটি অবজেক্ট ধারণ করে এবং ওভাররাইডে কেবলমাত্র সেই অবজেক্টের অংশ থাকে। তুলনাহীন বৈশিষ্ট্যগুলি অপসারণের পরিবর্তে, গভীর সেটিংস কেবলমাত্র যেখানে এটি বিদ্যমান তা আপডেট হবে। ডিফল্ট মিথ্যা।
ভোলআরন

19
জি উইলিকার্স, তারা এই নামকরণ করে সত্যই একটি ভাল কাজ করেছে। আপনি যদি জাভাস্ক্রিপ্ট অবজেক্টটি কীভাবে প্রসারিত করবেন সন্ধান করেন তবে তা ঠিক সামনে আসে! আপনি জাভাস্ক্রিপ্ট অবজেক্টগুলিকে একসাথে ফিউজ বা সেলাই করার চেষ্টা করছেন তবে আপনি এটির উপরে আঘাত করতে পারেন না।
ডেরেক গ্রেয়ার

2
ভ্যানিলা জেএস-এর কয়েকটি লাইনে তারা যা চায় তাই করবে এমন সময় গ্রন্থাগার পদ্ধতিটি ব্যবহার করার কথা লোকেদের বলবেন না। JQuery এর আগে একটা সময় ছিল!
ক্রেজিমার্লিন

346

হারমনি ECMAScript 2015 (ES6) নির্দিষ্ট করে Object.assignযা এই চেষ্টা করতে হবে।

Object.assign(obj1, obj2);

বর্তমান ব্রাউজার সমর্থন আরও ভাল হচ্ছে , তবে আপনি যদি এমন ব্রাউজারগুলির জন্য বিকাশ করতে পারেন যার সমর্থন নেই তবে আপনি একটি পলিফিল ব্যবহার করতে পারেন ।


35
মনে রাখবেন এটি কেবল অগভীর মার্জ
জোছিম লাউস

আমি মনে করি ইতিমধ্যে Object.assignবেশ সুন্দর কভারেজ রয়েছে: kangax.github.io/compat-table/es6/…
LazerBass

13
এটি এখন সঠিক উত্তর হওয়া উচিত। লোকেরা আজকাল এই জাতীয় জিনিসটিকে সমর্থন করে না এমন বিরল ব্রাউজারের সাথে সামঞ্জস্যপূর্ণ হওয়ার জন্য তাদের কোডটি সংকলন করে। পার্শ্ব দ্রষ্টব্য: আপনি যদি ওজেক্ট 1-তে যুক্ত করতে চান না, আপনি ব্যবহার করে একটি নতুন অবজেক্ট ফিরিয়ে দিতে পারেনObject.assign({}, obj1, obj2)
দুভরাই

6
@ দুভ্রাই আমার দেখা রিপোর্ট অনুসারে, আইই 11 অবশ্যই জুলাই ২০১ of সালের প্রায় 18% মার্কেট শেয়ারে বিরল নয়
২০১ ন্যানো উইজার্ড

3
@ করমানি ওপি বিশেষত উল্লেখ করেছে যে পুনরাবৃত্তি অপ্রয়োজনীয়। সুতরাং, যদিও এটি কার্যকরভাবে জানা যায় যে এই সমাধানটি অগভীর একত্রীকরণ সম্পাদন করে তবে এই উত্তরটি যথেষ্ট sufficient জোয়াকিমলু এর মন্তব্য ভাল প্রাপ্য upvotes পেয়েছে এবং প্রয়োজন যখন অতিরিক্ত তথ্য সরবরাহ করে। আমি মনে করি গভীর এবং অগভীর একত্রীকরণ এবং অনুরূপ বিষয়ের মধ্যে পার্থক্য এই আলোচনার আওতার বাইরে এবং অন্যান্য এসও প্রশ্নের সাথে আরও উপযুক্ত।
ন্যানো উইজার্ড

264

আমি বস্তুর বৈশিষ্ট্যগুলিকে একীভূত করতে কোডের জন্য গুগল করেছিলাম এবং এখানেই শেষ হয়েছিল। তবে যেহেতু পুনরাবৃত্ত মার্জ করার জন্য কোনও কোড ছিল না আমি নিজে এটি লিখেছিলাম। (সম্ভবত jQuery প্রসারিত বিটিডব্লিউ পুনরাবৃত্ত হয়?) যাইহোক, আশা করি অন্য কেউ এটির জন্যও দরকারী বলে মনে করছেন।

(এখন কোড ব্যবহার করে না Object.prototype :)

কোড

/*
* Recursively merge properties of two objects 
*/
function MergeRecursive(obj1, obj2) {

  for (var p in obj2) {
    try {
      // Property in destination object set; update its value.
      if ( obj2[p].constructor==Object ) {
        obj1[p] = MergeRecursive(obj1[p], obj2[p]);

      } else {
        obj1[p] = obj2[p];

      }

    } catch(e) {
      // Property in destination object not set; create it and set its value.
      obj1[p] = obj2[p];

    }
  }

  return obj1;
}

একটি উদাহরণ

o1 = {  a : 1,
        b : 2,
        c : {
          ca : 1,
          cb : 2,
          cc : {
            cca : 100,
            ccb : 200 } } };

o2 = {  a : 10,
        c : {
          ca : 10,
          cb : 20, 
          cc : {
            cca : 101,
            ccb : 202 } } };

o3 = MergeRecursive(o1, o2);

O3 টির মতো অবজেক্ট তৈরি করে

o3 = {  a : 10,
        b : 2,
        c : {
          ca : 10,
          cb : 20,
          cc : { 
            cca : 101,
            ccb : 202 } } };

11
ভাল লাগল, তবে আমি প্রথমে জিনিসগুলির একটি গভীর প্রতিলিপি তৈরি করব। রেফারেন্সের মাধ্যমে অবজেক্টগুলি পাস করার কারণে এই পদ্ধতিতে ও 1-কেও সংশোধন করা হবে।
স্কিরিট

1
এই আমি খুঁজছিলাম ছিল। চেষ্টা করার স্টেটমেন্ট স্টেটমেন্টে যাওয়ার আগে অবজেক্ট 2.হসনপ্রপার্টি (পি) কিনা তা নিশ্চিত করে নিন। অন্যথায়, আপনি প্রোটোটাইপ শৃঙ্খলে উচ্চ থেকে আপ মিশ্রিত হতে পারে অন্য কিছু বকাবকি শেষ হতে পারে।
আদম

3
ধন্যবাদ মার্কাস নোট করুন যে ও 1 মার্জরেকারসিভ দ্বারাও সংশোধিত হয়েছে, সুতরাং শেষে, o1 এবং o3 অভিন্ন। আপনি যদি কিছু না ফিরিয়ে দেন তবে এটি আরও স্বজ্ঞাত হতে পারে, তাই ব্যবহারকারীরা জানে যে তারা কী সরবরাহ করছে (ও 1) সংশোধিত হয়ে ফলাফলে পরিণত হয়। এছাড়াও, আপনার উদাহরণে, এটি o2 এর সাথে মূলত o1 তে অন্তর্ভুক্ত নয় এমন কিছু যুক্ত করার উপযুক্ত হতে পারে, যাতে o2 বৈশিষ্ট্যগুলি O1 তে সন্নিবেশিত হয় (নীচে অন্য কেউ আপনার উদাহরণটি অনুলিপি করে বিকল্পধারার কোডটি জমা দেয়) তবে সেগুলি ভেঙে যায় যখন o2 এর বৈশিষ্ট্য নেই O1 এ - তবে আপনারা এই ক্ষেত্রে কাজ করে)।
প্যানকেক

7
এটি একটি ভাল উত্তর, কিন্তু একটি দম্পতি quibbles: 1) কোন যুক্তি ব্যতিক্রম উপর ভিত্তি করে করা উচিত নয়; এই ক্ষেত্রে, নিক্ষিপ্ত যে কোনও ব্যতিক্রম অপ্রত্যাশিত ফলাফলের সাথে ধরা পড়বে। 2) আমি আসল অবজেক্টটি পরিবর্তিত হওয়ায় কিছু না ফেরানোর বিষয়ে @ প্যানকেকের মন্তব্যের সাথে আমি সম্মত। ব্যতিক্রম যুক্তি ছাড়াই এখানে একটি জেএসফিডেলের উদাহরণ রয়েছে: jsfiddle.net/jlowery2663/z8at6knn/4 - জেফ লোরি
জেফ লোরি

3
এছাড়াও, অবজেক্ট 2 [পি]। কনস্ট্রাক্টর == যে কোনও ক্ষেত্রে যেখানে বস্তুর অ্যারে রয়েছে সেখানে অ্যারের প্রয়োজন needed
সুরকার 19

175

মনে রাখবেন যে ও underscore.js- extendস্মৃতি একটি ওয়ান-লাইনারে এটি করে:

_.extend({name : 'moe'}, {age : 50});
=> {name : 'moe', age : 50}

36
এই উদাহরণটি ঠিক আছে আপনি বেনামে থাকা অবজেক্টগুলির সাথে কাজ করছেন, তবে যদি এটি না হয় তবে মিউটেশন সম্পর্কিত jQuery উত্তরের সতর্কতায় ওয়েবম্যাট এর মন্তব্য এখানে প্রযোজ্য, কারণ আন্ডারস্কোরটি গন্তব্য অবজেক্টটিকে রূপান্তরিত করে । JQuery উত্তরের মত, এই রূপান্তর- _({}).extend(obj1, obj2);
মুক্তটি করতে

8
আপনি যেটি অর্জন করতে চাইছেন তার উপর নির্ভর করে আর একটি হতে পারে: _.defaults(object, *defaults)"ডিফল্ট অবজেক্ট থেকে মানগুলি দিয়ে নাল এবং অপরিজ্ঞাত বৈশিষ্ট্য পূরণ করুন এবং বস্তুটি ফিরে দিন।"
কনিকে

অনেকে গন্তব্য অবজেক্টটিকে রূপান্তরিত করার বিষয়ে মন্তব্য করেছেন, তবে একটি পদ্ধতি না করে একটি নতুন তৈরি করার পরিবর্তে একটি সাধারণ প্যাটার্ন (উদাহরণস্বরূপ ডোজোতে) dojo.mixin (dojo.clone (myobj), {newpropertys: "যোগ করতে হবে টু মায়োবজ "})
কলিন ডি

7
ইন্ডসকোরগুলি একটি নির্বিচার সংখ্যক অবজেক্ট নিতে পারে, তাই করে আপনি মূল বস্তুর রূপান্তর এড়াতে পারবেন var mergedObj = _.extend({}, obj1, obj2)
লোবাতি

84

JQuery প্রসারিত () এর মতো, আপনারও AngularJS তে একই ফাংশন রয়েছে :

// Merge the 'options' object into the 'settings' object
var settings = {validate: false, limit: 5, name: "foo"};
var options  = {validate: true, name: "bar"};
angular.extend(settings, options);

1
@ এনএক্সএ, আমি মনে করি এটি একটি বিকল্প হতে পারে যদি আপনি কেবল এই এফএনটির জন্য কোনও লিবি যোগ করতে না চান।
juanmf

67

আমার আজকে বস্তুগুলিকে মার্জ করা দরকার এবং এই প্রশ্নটি (এবং উত্তরগুলি) আমাকে অনেক সহায়তা করেছে। আমি কয়েকটি উত্তর চেষ্টা করেছিলাম, কিন্তু সেগুলির মধ্যে কোনওটিই আমার প্রয়োজনীয়তার সাথে খাপ খায়নি, তাই আমি কিছু উত্তরগুলি সংযুক্ত করেছি, নিজেই কিছু যুক্ত করেছি এবং একটি নতুন মার্জ ফাংশন নিয়ে এসেছি। এটা এখানে:

var merge = function() {
    var obj = {},
        i = 0,
        il = arguments.length,
        key;
    for (; i < il; i++) {
        for (key in arguments[i]) {
            if (arguments[i].hasOwnProperty(key)) {
                obj[key] = arguments[i][key];
            }
        }
    }
    return obj;
};

কিছু উদাহরণ ব্যবহার:

var t1 = {
    key1: 1,
    key2: "test",
    key3: [5, 2, 76, 21]
};
var t2 = {
    key1: {
        ik1: "hello",
        ik2: "world",
        ik3: 3
    }
};
var t3 = {
    key2: 3,
    key3: {
        t1: 1,
        t2: 2,
        t3: {
            a1: 1,
            a2: 3,
            a4: [21, 3, 42, "asd"]
        }
    }
};

console.log(merge(t1, t2));
console.log(merge(t1, t3));
console.log(merge(t2, t3));
console.log(merge(t1, t2, t3));
console.log(merge({}, t1, { key1: 1 }));

3
উত্তম উত্তর তবে আমি মনে করি যদি কোনও সম্পত্তি প্রথমটিতে এবং দ্বিতীয়টিতে উপস্থিত থাকে এবং আপনি প্রথম এবং দ্বিতীয় সংশ্লেষ করে একটি নতুন অবজেক্ট তৈরি করার চেষ্টা করছেন তবে প্রথম অবজেক্টে উপস্থিত
অনন্যগুলি

2
তবে আচরণ কি প্রত্যাশিত নয়? এই ফাংশনের উদ্দেশ্যটি আর্গুমেন্ট ক্রমে মানগুলিকে ওভাররাইড করে। পরবর্তী একটি বর্তমানকে ওভাররাইড করবে। কীভাবে আপনি অনন্য মূল্যবোধ সংরক্ষণ করতে পারেন? আমার উদাহরণ থেকে, আপনি কি আশা করবেন merge({}, t1, { key1: 1 })?
এমরে এরকান

আমার প্রত্যাশাটি কেবল অ-অবজেক্ট-টাইপযুক্ত মানগুলিকে মার্জ করা।
এজিমেপ্লেয়ার

প্রত্যাশিত ফলাফলটি নিম্নলিখিত হিসাবে ব্যর্থ হয়: gist.github.com/ceremcem/a54f90923c6e6ec42c7daf24cf2768bd
অনুষ্ঠান

এটি আমার নোড.জেএস প্রকল্পের জন্য কঠোর মোডে আমার পক্ষে কাজ করেছে। এখনও অবধি, এই পোস্টে এটি সেরা উত্তর।
klewis

48

আপনি অবজেক্ট স্প্রেড বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন - পর্যায়ক্রমে একটি পর্যায় 3 ইসমাসক্রিপ্ট প্রস্তাব

const obj1 = { food: 'pizza', car: 'ford' };
const obj2 = { animal: 'dog' };

const obj3 = { ...obj1, ...obj2 };
console.log(obj3);


ব্রাউজার সমর্থন?
আল্ফ.দেব

1
@ আল্ফ.দেব আপনি ক্যানিউজ ডট কম জানেন?
কনেক্সো

Node.js. এ কাজ করার জন্য আমি 3 ডট সিনট্যাক্স পাচ্ছি না। নোড এটি সম্পর্কে অভিযোগ।
ক্লিউস

41

প্রদত্ত সমাধান চেক করতে পরিবর্তন করা উচিত source.hasOwnProperty(property)মধ্যে for..inবরাদ্দ সামনে লুপ - অন্যথায়, আপনি পুরো প্রোটোটাইপ শৃঙ্খল, যা খুব কমই পছন্দসই বৈশিষ্ট্য অনুলিপি শেষ পর্যন্ত ...


40

কোডের এক লাইনে এন অবজেক্টের বৈশিষ্ট্যগুলি মার্জ করুন

একটি Object.assignপদ্ধতি ECMAScript 2015 (ES6) স্ট্যান্ডার্ডের একটি অংশ এবং আপনার যা প্রয়োজন ঠিক তা করে। ( IEসমর্থিত নয়)

var clone = Object.assign({}, obj);

অবজেক্ট.সেসাইন () পদ্ধতিটি এক বা একাধিক উত্স অবজেক্ট থেকে একটি লক্ষ্য অবজেক্টে সমস্ত পরিগণিত নিজস্ব সম্পত্তিগুলির মানগুলি অনুলিপি করতে ব্যবহৃত হয়।

আরও পড়ুন ...

Polyfill পুরোনো ব্রাউজারে সমর্থন করার জন্য:

if (!Object.assign) {
  Object.defineProperty(Object, 'assign', {
    enumerable: false,
    configurable: true,
    writable: true,
    value: function(target) {
      'use strict';
      if (target === undefined || target === null) {
        throw new TypeError('Cannot convert first argument to object');
      }

      var to = Object(target);
      for (var i = 1; i < arguments.length; i++) {
        var nextSource = arguments[i];
        if (nextSource === undefined || nextSource === null) {
          continue;
        }
        nextSource = Object(nextSource);

        var keysArray = Object.keys(nextSource);
        for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) {
          var nextKey = keysArray[nextIndex];
          var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
          if (desc !== undefined && desc.enumerable) {
            to[nextKey] = nextSource[nextKey];
          }
        }
      }
      return to;
    }
  });
}

পুরানো ব্রাউজারে 'কঠোর ব্যবহার' কী করে বা কেন এটি একেবারেই আছে। ব্রাউজারগুলি যা অবজেক্টকে সমর্থন করে [DefineProperty; কী; getOwnPropertyDescriptor; ইত্যাদি], একেবারে পুরানো নয়। এগুলি জেনো .5 ইউএ এর ঠিক আগের সংস্করণ।
বেকিম বাকাজ

Objects.assignঅন্য উত্তরগুলি যা দেয় না এমন মার্জড অবজেক্ট ফিরিয়ে দেয় তা স্পষ্ট করার জন্য ধন্যবাদ । এটি আরও কার্যকরী প্রোগ্রামিং শৈলী।
শ্রীধর সারনোবাত

36

নিম্নলিখিত দুটি সম্ভবত একটি ভাল সূচনা পয়েন্ট। লোডাশের সেই বিশেষ প্রয়োজনগুলির জন্য একটি কাস্টমাইজার ফাংশনও রয়েছে!

_.extend( http://underscorejs.org/#extend )
_.merge( https://lodash.com/docs# विस )


4
দয়া করে নোট করুন যে উপরের পদ্ধতিগুলি মূল বস্তুকে রূপান্তরিত করে।
ওয়াটওয়ার

লড্যাশ পদ্ধতিটি আমার পক্ষে কাজ করেছিল কারণ আমি দুটি বস্তুকে একীভূত করতে এবং আরও এক বা দুই স্তর গভীর (কেবলমাত্র সেগুলি প্রতিস্থাপন / মুছার চেয়ে) আরও বেশি নীড়যুক্ত বৈশিষ্ট্যগুলি বজায় রাখতে চেয়েছিলাম।
স্যামব্রিক

সত্য @ ওয়াটওয়ার ঠিক এই কারণে একটি বাগ ছিল। সর্বদা নিশ্চিত হয়ে নিন যে এটি সর্বদা _ ডুবে ({}, ... ...
মার্টিন ক্রিমার

29

যাইহোক, আপনি যা করছেন তা হ'ল সংযুক্তি নয়, বৈশিষ্ট্যগুলি ওভাররাইট করা ...

এইভাবে জাভাস্ক্রিপ্ট অবজেক্টস অঞ্চলটি সত্যই একীভূত হয়েছে: কেবলমাত্র বস্তুগুলির কীগুলি toযা নিজেরাই বস্তু নয় সেগুলি ওভাররাইট করা হবে from। অন্য সব কিছুই সত্যই একত্রিত হয়ে যাবে । অবশ্যই আপনি এই আচরণটি এমন কোনও কিছুর উপরে ওভাররাইট না করে পরিবর্তন করতে পারবেন যা কেবলমাত্র যদি to[n] is undefinedইত্যাদি, ...

var realMerge = function (to, from) {

    for (n in from) {

        if (typeof to[n] != 'object') {
            to[n] = from[n];
        } else if (typeof from[n] == 'object') {
            to[n] = realMerge(to[n], from[n]);
        }
    }
    return to;
};

ব্যবহার:

var merged = realMerge(obj1, obj2);

3
আমাকে অনেক সাহায্য করেছিল, আন্ডারস্কোর
জেএসগুলি

1
টাইপফুল অ্যারে এবং টাইপফুল নাল লক্ষণীয় 'অবজেক্ট' ফিরে আসবে এবং এটিকে ভেঙে দেবে।
সালাকার

: @ u01jmg3 আমার উত্তর এখানে দেখতে stackoverflow.com/questions/27936772/... isObject ফাংশন -
Salakar

আপনি যদি
নোড.জেএস

28

এই যে আমার ছুরিকাঘাত

  1. গভীর সংশ্লেষ সমর্থন করে
  2. যুক্তি পরিবর্তন না
  3. যে কোনও সংখ্যক যুক্তি গ্রহণ করে
  4. অবজেক্টের প্রোটোটাইপ প্রসারিত করে না
  5. অন্য লাইব্রেরির উপর নির্ভর করে না ( jQuery , MooTools , অ্যান্ডস कोर . জেএস) , ইত্যাদি)
  6. ওসনপ্রোপার্টি চেক অন্তর্ভুক্ত
  7. ইহা ছোট :)

    /*
        Recursively merge properties and return new object
        obj1 &lt;- obj2 [ &lt;- ... ]
    */
    function merge () {
        var dst = {}
            ,src
            ,p
            ,args = [].splice.call(arguments, 0)
        ;
    
        while (args.length > 0) {
            src = args.splice(0, 1)[0];
            if (toString.call(src) == '[object Object]') {
                for (p in src) {
                    if (src.hasOwnProperty(p)) {
                        if (toString.call(src[p]) == '[object Object]') {
                            dst[p] = merge(dst[p] || {}, src[p]);
                        } else {
                            dst[p] = src[p];
                        }
                    }
                }
            }
        }
    
       return dst;
    }

উদাহরণ:

a = {
    "p1": "p1a",
    "p2": [
        "a",
        "b",
        "c"
    ],
    "p3": true,
    "p5": null,
    "p6": {
        "p61": "p61a",
        "p62": "p62a",
        "p63": [
            "aa",
            "bb",
            "cc"
        ],
        "p64": {
            "p641": "p641a"
        }
    }
};

b = {
    "p1": "p1b",
    "p2": [
        "d",
        "e",
        "f"
    ],
    "p3": false,
    "p4": true,
    "p6": {
        "p61": "p61b",
        "p64": {
            "p642": "p642b"
        }
    }
};

c = {
    "p1": "p1c",
    "p3": null,
    "p6": {
        "p62": "p62c",
        "p64": {
            "p643": "p641c"
        }
    }
};

d = merge(a, b, c);


/*
    d = {
        "p1": "p1c",
        "p2": [
            "d",
            "e",
            "f"
        ],
        "p3": null,
        "p5": null,
        "p6": {
            "p61": "p61b",
            "p62": "p62c",
            "p63": [
                "aa",
                "bb",
                "cc"
            ],
            "p64": {
                "p641": "p641a",
                "p642": "p642b",
                "p643": "p641c"
            }
        },
        "p4": true
    };
*/

এই পৃষ্ঠাটি থেকে আমি অন্যদের পরীক্ষা করে দেখেছি, এই ফাংশনটি সত্যই পুনরাবৃত্ত হয় (একটি গভীর সংশ্লেষ করে) এবং jQuery.extend () সত্যিই কী করে তা নকল করে। তবে এটির পক্ষে প্রথম অবজেক্ট / আর্গুমেন্টটি সংশোধন করা ভাল হবে যাতে কোনও ব্যবহারকারী সিদ্ধান্ত নিতে পারে যে তারা কোনও খালি বস্তুতে {}প্রথম প্যারামিটার হিসাবে পাস করতে চায় বা ফাংশনটি মূল অবজেক্টটি সংশোধন করতে চায় কিনা। অতএব যদি আপনি পরিবর্তন dst = {}করতে dst = arguments[0]এটি প্রথম বস্তুর আপনি মার্জ বস্তু মধ্যে পাস পরিবর্তন করতে হবে
Jasdeep খালসা

3
এখন এটি ক্রোমে কাজ করা বন্ধ করে দিয়েছে। আমি মনে করি toString.call(src) == '[object Object]'যে কোনও বস্তু আছে কিনা তা যাচাই করার জন্য এই ধরনের নির্মাণ ব্যবহার করা খারাপ ধারণা । typeof srcঅনেক ভাল। তদুপরি এটি অ্যারেগুলিকে বস্তুতে রূপান্তরিত করে (সর্বশেষ ক্রোমে আমি এমন আচরণ পেয়েছি)।
m03geek

লোভী লুপের ভিতরে আমার এটি করা দরকার ছিল, আমি লড্যাশ (এক ধরণের আন্ডারস্কোর লাইব) থেকে _ এখন পর্যন্ত _ ডুবানো (অবজেক্ট, [উত্সগুলি]) ব্যবহার করে এই ফাংশনটি বেনমার্ক করেছি: আপনার ফাংশনটি প্রায় দ্বিগুণ দ্রুত ধন্যবাদ বন্ধু.
আরনাউদ বাউচোট

20

Object.assign ()

ECMAScript 2015 (ES6)

এটি ECMAScript 2015 (ES6) স্ট্যান্ডার্ডের একটি নতুন প্রযুক্তি। এই প্রযুক্তির স্পেসিফিকেশন চূড়ান্ত করা হয়েছে, তবে বিভিন্ন ব্রাউজারে ব্যবহার এবং প্রয়োগের স্থিতির জন্য সামঞ্জস্যতা সারণীটি পরীক্ষা করুন।

অবজেক্ট.সেসাইন () পদ্ধতিটি এক বা একাধিক উত্স অবজেক্ট থেকে একটি লক্ষ্য অবজেক্টে সমস্ত পরিগণিত নিজস্ব সম্পত্তিগুলির মানগুলি অনুলিপি করতে ব্যবহৃত হয়। এটি লক্ষ্য বস্তুটি ফিরিয়ে দেবে।

var o1 = { a: 1 };
var o2 = { b: 2 };
var o3 = { c: 3 };

var obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1);  // { a: 1, b: 2, c: 3 }, target object itself is changed.

19

খুব জটিল নয় এমন বস্তুর জন্য আপনি JSON ব্যবহার করতে পারেন :

var obj1 = { food: 'pizza', car: 'ford' }
var obj2 = { animal: 'dog', car: 'chevy'}
var objMerge;

objMerge = JSON.stringify(obj1) + JSON.stringify(obj2);

// {"food": "pizza","car":"ford"}{"animal":"dog","car":"chevy"}

objMerge = objMerge.replace(/\}\{/, ","); //  \_ replace with comma for valid JSON

objMerge = JSON.parse(objMerge); // { food: 'pizza', animal: 'dog', car: 'chevy'}
// Of same keys in both objects, the last object's value is retained_/

মনে মনে রেখো যে এই উদাহরণে "} {" অবশ্যই একটি স্ট্রিংয়ের মধ্যে উপস্থিত হবে না !


4
var so1 = JSON.stringify(obj1); var so2 = JSON.stringify(obj1); objMerge = so1.substr(0, so1.length-1)+","+so2.substr(1); console.info(objMerge);
কামিস

function merge(obj1, obj2) { return JSON.parse((JSON.stringify(obj1) + JSON.stringify(obj2)) .replace(/\}\{/g, ',').replace(/,\}/g, '}').replace(/\{,/g, '{')); }
অ্যালেক্স আইভ্যাসিভ

বা ওয়ান-লাইনার হিসাবে:objMerge = JSON.parse((JSON.stringify(obj1) + JSON.stringify(obj2)).replace(/\}\{/, ", "));
রাব্বি শুকি গুড়

1
@ চার্লস, দুঃখিত তবে "এই পদ্ধতিটি খুব বিপজ্জনক" তবে মজাদারও - এটি সবচেয়ে নিরাপদ সম্ভাব্য প্রথমত এটি JSON ব্যবহার করে অবজেক্টের বিষয়বস্তু পড়ার ভারী উত্তোলন করে, দ্বিতীয়ত, এটি JSON অবজেক্টটি ব্যবহার করে যা সব থেকে নিরাপদ is জেএসওন সামঞ্জস্যপূর্ণ অবজেক্ট স্ট্রিং আক্ষরিক থেকে জেএসওকে প্রতিবিম্বিত করার জন্য মেশিনটি অনুকূলিত। এবং আইই 8 এর সাথে পিছনে সামঞ্জস্যপূর্ণ যা এটির মান বাস্তবায়নের জন্য প্রথম ব্রাউজার। এটি কেবল আমাকে অবাক করে তোলে "কেন ওহ কেন আপনাকে এমন বোকা কথা বলতে এবং এটি থেকে পালিয়ে যেতে হবে"?
বেকিম বাকাজ

আমি বিশ্বাস করি যে স্ট্রিংফাই ক্যান্ট ব্যবহার করার পরে অবজেক্টের ফাংশনগুলি এখানে ভেঙে যাবে, তবে আমরা কি অন্য ডাউনসাইডগুলি পরিষ্কার করতে পারি?
ইয়েহডিকসন

18

সেখানে একটি লাইব্রেরি নামক deepmergeউপর GitHub : যে কিছু আকর্ষণ হচ্ছে বলে মনে হয়। এটি একটি স্ট্যান্ডেলোন, এনপিএম এবং বোর প্যাকেজ ম্যানেজার উভয়ের মাধ্যমে উপলব্ধ ।

আমি উত্তরগুলি থেকে কপি-পেস্টিং কোডের পরিবর্তে এটিকে ব্যবহার বা উন্নত করতে চাই।


17

এটি করার সর্বোত্তম উপায় হ'ল অবজেক্ট.ডেফাইনপ্রোপার্টি ব্যবহার করে অযোগ্য গণনাকারী একটি যথাযথ সম্পত্তি যুক্ত করা।

আপনি এখনও অবজেক্ট.প্রোটোটাইপ.একস্ট্যান্ডের সাথে সম্পত্তি তৈরি করতে চাইলে আপনি নতুন তৈরি "প্রসারিত" না করেই আপনার অবজেক্ট বৈশিষ্ট্যগুলি নিয়ে পুনরাবৃত্তি করতে সক্ষম হবেন।

আশা করি এটি সাহায্য করে:

অবজেক্ট.ডিফাইনপ্রোপার্টি (অবজেক্ট.প্রোটোটাইপ, "প্রসারিত", {
    গণনাযোগ্য: মিথ্যা,
    মান: ফাংশন (থেকে) {
        var প্রপস = অবজেক্ট.জেটআউটনপ্রোপার্টিনেমস (থেকে);
        var dest = this;
        props.forEach (ফাংশন (নাম) {
            যদি (নিয়মে নাম) {
                var গন্তব্য = অবজেক্ট.জেটআউটনপ্রোপার্টিডেস্কিটার (থেকে, নাম);
                অবজেক্ট.ডিফাইনপ্রপার্টি (গন্তব্য, নাম, গন্তব্য);
            }
        });
        এটি ফেরত দিন;
    }
});

আপনার যদি সেই কাজ শেষ হয়ে যায় তবে আপনি এটি করতে পারেন:

var اعتراض = {
    নাম: 'স্ট্যাক',
    সমাপ্তি: 'ওভারফ্লো'
}
var প্রতিস্থাপন = {
    নাম: 'স্টক'
};

obj.extend (প্রতিস্থাপন);

আমি এটি সম্পর্কে এখানে একটি ব্লগ পোস্ট লিখেছি: http://onemoredigit.com/post/1527191998/extending-objects-in-node-js


এক সেকেন্ড অপেক্ষা করুন --- কোডটি কাজ করে না! :( অন্যান্য মার্জড অ্যালগরিদমের সাথে তুলনা করতে এটি jsperf এ sertedোকানো হয়েছে, এবং কোডটি ব্যর্থ হয় - ফাংশন প্রসারিতের অস্তিত্ব নেই
জেনস রোল্যান্ড

16

আপনি কেবল jQuery ব্যবহার করতে পারেন extend

var obj1 = { val1: false, limit: 5, name: "foo" };
var obj2 = { val2: true, name: "bar" };

jQuery.extend(obj1, obj2);

এখন obj1ধারণ করে সব মান obj1এবংobj2


2
জেজ 1 এ সমস্ত মান ধারণ করবে, অ্যাজেজ 2 নয়। আপনি প্রথম বস্তুটি প্রসারিত করছেন। jQuery.extend( target [, object1 ] [, objectN ] )
রুটার 19

5
এই প্রশ্নটি jQuery সম্পর্কে নয়। জাভাস্ক্রিপ্ট! = JQuery
জর্জি রিভ

1
আমি জাভাস্ক্রিপ্টের জন্য গুগলড করেছি, তবে এটি একটি সহজ পদ্ধতির
এহসান

13

প্রোটোটাইপটিতে এটি রয়েছে:

Object.extend = function(destination,source) {
    for (var property in source)
        destination[property] = source[property];
    return destination;
}

obj1.extend(obj2) আপনি যা চান তা করবে


6
আপনি অবজেক্ট.প্রোটোটাইপ.একস্টেন্ডকে বোঝাতে চেয়েছিলেন? যাইহোক, অবজেক্ট.প্রোটোটাইপ বাড়ানো ভাল ধারণা নয়। -1।
সমাধান

এটি ভাবতে আসুন, এটি সম্ভবত হওয়া উচিত Object.prototypeএবং নাও Object... ভাল ধারণা বা না, prototype.jsফ্রেমওয়ার্কটি এটিই করে এবং তাই আপনি যদি এটি ব্যবহার করেন বা এটির উপর নির্ভর করে এমন অন্য কোনও কাঠামো Object.prototypeইতিমধ্যে প্রসারিত হবে extend
21

2
আমি আপনাকে বীণা বানাতে চাইছি না বরং এটি বলাই ঠিক আছে কারণ প্রোটোটাইপ.জেএস একটি দুর্বল যুক্তি। প্রোটোটাইপ.জেএস জনপ্রিয় তবে এর অর্থ এই নয় যে তারা জাভাস্ক্রিপ্ট কীভাবে করবেন তার রোল মডেল। প্রোটোটাইপ লাইব্রেরির এই বিশদ পর্যালোচনাটিকে কোনও জেএস প্রো দ্বারা পর্যালোচনা করুন। dhtmlkocolate.com/?category=/JavaScript/&date=2008/06/17/…
সমাধান

7
এর সঠিক বা ভুল হলে কে যত্নশীল? যদি এটি কাজ করে তবে এটি কাজ করে। কোনও চুক্তি রাখতে, নতুন ক্লায়েন্টকে জিততে বা সময়সীমা পূরণের চেষ্টা না করে নিখুঁত সমাধানের জন্য অপেক্ষা করা দুর্দান্ত। এখানে বিনা মূল্যে প্রোগ্রামিং সম্পর্কে আগ্রহী এমন কাউকে দিন এবং তারা শেষ পর্যন্ত সবকিছু "সঠিক" উপায়ে করবেন।
ডেভিড

1
আপনি সব ছেলেদের কোথায় খুঁজে পেলেন Object.prototype? Object.extendআপনার বস্তুগুলিতে হস্তক্ষেপ করবে না, এটি কেবল কোনও Objectবস্তুর সাথে একটি ফাংশন সংযুক্ত করে । আর obj1.extend(obj2)ফায়ার ফাংশনের সঠিক উপায় নয়, Object.extend(obj1, obj2)উত্তাপযুক্ত ব্যবহার করুন
আর্টনিকপ্রো

13

** অবজেক্টগুলি মার্জ করা সহজ Object.assignবা স্প্রেড ...অপারেটর ব্যবহার করে **

var obj1 = { food: 'pizza', car: 'ford' }
var obj2 = { animal: 'dog', car: 'BMW' }
var obj3 = {a: "A"}


var mergedObj = Object.assign(obj1,obj2,obj3)
 // or using the Spread operator (...)
var mergedObj = {...obj1,...obj2,...obj3}

console.log(mergedObj);

অবজেক্টগুলি ডান থেকে বামে একত্রিত করা হয়েছে, এর অর্থ হ'ল বস্তুগুলির ডানদিকে অবজেক্ট হিসাবে অভিন্ন বৈশিষ্ট্য রয়েছে over

এই উদাহরণে obj2.carওভাররাইডobj1.car


12

কেউ যদি গুগল বন্ধ লাইব্রেরি ব্যবহার করে থাকে :

goog.require('goog.object');
var a = {'a': 1, 'b': 2};
var b = {'b': 3, 'c': 4};
goog.object.extend(a, b);
// Now object a == {'a': 1, 'b': 3, 'c': 4};

অনুরূপ সহায়ক ফাংশন অ্যারের জন্য বিদ্যমান :

var a = [1, 2];
var b = [3, 4];
goog.array.extend(a, b); // Extends array 'a'
goog.array.concat(a, b); // Returns concatenation of array 'a' and 'b'

10

আমি ডেভিড কোলিয়ারের পদ্ধতিটি প্রসারিত করেছি:

  • একাধিক বস্তু একত্রিত করার সম্ভাবনা যুক্ত করা হয়েছে
  • গভীর বস্তু সমর্থন করে
  • ওভাররাইড প্যারামিটার (এটি শেষ প্যারামিটারটি বুলিয়ান কিনা তা সনাক্ত করা হয়েছে)

যদি ওভাররাইডটি মিথ্যা হয় তবে কোনও সম্পত্তি ওভাররাইড করা হবে না তবে নতুন বৈশিষ্ট্য যুক্ত হবে।

ব্যবহার: اعتراض.মিটার (মার্জ ... [, ওভাররাইড]);

আমার কোডটি এখানে:

Object.defineProperty(Object.prototype, "merge", {
    enumerable: false,
    value: function () {
        var override = true,
            dest = this,
            len = arguments.length,
            props, merge, i, from;

        if (typeof(arguments[arguments.length - 1]) === "boolean") {
            override = arguments[arguments.length - 1];
            len = arguments.length - 1;
        }

        for (i = 0; i < len; i++) {
            from = arguments[i];
            if (from != null) {
                Object.getOwnPropertyNames(from).forEach(function (name) {
                    var descriptor;

                    // nesting
                    if ((typeof(dest[name]) === "object" || typeof(dest[name]) === "undefined")
                            && typeof(from[name]) === "object") {

                        // ensure proper types (Array rsp Object)
                        if (typeof(dest[name]) === "undefined") {
                            dest[name] = Array.isArray(from[name]) ? [] : {};
                        }
                        if (override) {
                            if (!Array.isArray(dest[name]) && Array.isArray(from[name])) {
                                dest[name] = [];
                            }
                            else if (Array.isArray(dest[name]) && !Array.isArray(from[name])) {
                                dest[name] = {};
                            }
                        }
                        dest[name].merge(from[name], override);
                    } 

                    // flat properties
                    else if ((name in dest && override) || !(name in dest)) {
                        descriptor = Object.getOwnPropertyDescriptor(from, name);
                        if (descriptor.configurable) {
                            Object.defineProperty(dest, name, descriptor);
                        }
                    }
                });
            }
        }
        return this;
    }
});

উদাহরণ এবং টেস্ট কেস:

function clone (obj) {
    return JSON.parse(JSON.stringify(obj));
}
var obj = {
    name : "trick",
    value : "value"
};

var mergeObj = {
    name : "truck",
    value2 : "value2"
};

var mergeObj2 = {
    name : "track",
    value : "mergeObj2",
    value2 : "value2-mergeObj2",
    value3 : "value3"
};

assertTrue("Standard", clone(obj).merge(mergeObj).equals({
    name : "truck",
    value : "value",
    value2 : "value2"
}));

assertTrue("Standard no Override", clone(obj).merge(mergeObj, false).equals({
    name : "trick",
    value : "value",
    value2 : "value2"
}));

assertTrue("Multiple", clone(obj).merge(mergeObj, mergeObj2).equals({
    name : "track",
    value : "mergeObj2",
    value2 : "value2-mergeObj2",
    value3 : "value3"
}));

assertTrue("Multiple no Override", clone(obj).merge(mergeObj, mergeObj2, false).equals({
    name : "trick",
    value : "value",
    value2 : "value2",
    value3 : "value3"
}));

var deep = {
    first : {
        name : "trick",
        val : "value"
    },
    second : {
        foo : "bar"
    }
};

var deepMerge = {
    first : {
        name : "track",
        anotherVal : "wohoo"
    },
    second : {
        foo : "baz",
        bar : "bam"
    },
    v : "on first layer"
};

assertTrue("Deep merges", clone(deep).merge(deepMerge).equals({
    first : {
        name : "track",
        val : "value",
        anotherVal : "wohoo"
    },
    second : {
        foo : "baz",
        bar : "bam"
    },
    v : "on first layer"
}));

assertTrue("Deep merges no override", clone(deep).merge(deepMerge, false).equals({
    first : {
        name : "trick",
        val : "value",
        anotherVal : "wohoo"
    },
    second : {
        foo : "bar",
        bar : "bam"
    },
    v : "on first layer"
}));

var obj1 = {a: 1, b: "hello"};
obj1.merge({c: 3});
assertTrue(obj1.equals({a: 1, b: "hello", c: 3}));

obj1.merge({a: 2, b: "mom", d: "new property"}, false);
assertTrue(obj1.equals({a: 1, b: "hello", c: 3, d: "new property"}));

var obj2 = {};
obj2.merge({a: 1}, {b: 2}, {a: 3});
assertTrue(obj2.equals({a: 3, b: 2}));

var a = [];
var b = [1, [2, 3], 4];
a.merge(b);
assertEquals(1, a[0]);
assertEquals([2, 3], a[1]);
assertEquals(4, a[2]);


var o1 = {};
var o2 = {a: 1, b: {c: 2}};
var o3 = {d: 3};
o1.merge(o2, o3);
assertTrue(o1.equals({a: 1, b: {c: 2}, d: 3}));
o1.b.c = 99;
assertTrue(o2.equals({a: 1, b: {c: 2}}));

// checking types with arrays and objects
var bo;
a = [];
bo = [1, {0:2, 1:3}, 4];
b = [1, [2, 3], 4];

a.merge(b);
assertTrue("Array stays Array?", Array.isArray(a[1]));

a = [];
a.merge(bo);
assertTrue("Object stays Object?", !Array.isArray(a[1]));

a = [];
a.merge(b);
a.merge(bo);
assertTrue("Object overrides Array", !Array.isArray(a[1]));

a = [];
a.merge(b);
a.merge(bo, false);
assertTrue("Object does not override Array", Array.isArray(a[1]));

a = [];
a.merge(bo);
a.merge(b);
assertTrue("Array overrides Object", Array.isArray(a[1]));

a = [];
a.merge(bo);
a.merge(b, false);
assertTrue("Array does not override Object", !Array.isArray(a[1]));

আমার সমান পদ্ধতিটি এখানে পাওয়া যাবে: জাভাস্ক্রিপ্টে অবজেক্টের তুলনা



9

ইন Ext জাতীয় 4 এটা নিম্নরূপে করা সম্ভব:

var mergedObject = Ext.Object.merge(object1, object2)

// Or shorter:
var mergedObject2 = Ext.merge(object1, object2)

দেখুন অবজেক্ট: একত্রীকরণ (বস্তু)


1
EXTJS-9173 বাগ থেকে সাবধান থাকুন +2 বছর পরে এখনও সমাধান হয়নি
ক্রিস

9

বাহ .. এটি আমি একাধিক পৃষ্ঠাগুলি সহ প্রথম স্ট্যাক ওভারফ্লো পোস্টটি। অন্য "উত্তর" যুক্ত করার জন্য ক্ষমা

এই পদ্ধতিটি ES5 এবং পূর্বের জন্য - ES6 সম্বোধন করার জন্য প্রচুর অন্যান্য উত্তর রয়েছে।

সম্পত্তিটি ব্যবহার করে কোনও "গভীর" অবজেক্ট মার্জ করতে দেখিনি arguments। এখানে আমার উত্তর - কমপ্যাক্ট এবং পুনরাবৃত্ত , সীমাহীন অবজেক্ট আর্গুমেন্টগুলি পাস করার অনুমতি দেয়:

function extend() {
    for (var o = {}, i = 0; i < arguments.length; i++) {
        // if (arguments[i].constructor !== Object) continue;
        for (var k in arguments[i]) {
            if (arguments[i].hasOwnProperty(k)) {
                o[k] = arguments[i][k].constructor === Object ? extend(o[k] || {}, arguments[i][k]) : arguments[i][k];
            }
        }
    }
    return o;
}

যে অংশটি মন্তব্য করা হয়েছে তা alচ্ছিক .. এটি কেবলমাত্র আর্গুমেন্ট (ত্রুটি রোধ করা) নয় এমন আর্গুমেন্টগুলি এড়িয়ে যাবে।

উদাহরণ:

extend({
    api: 1,
    params: {
        query: 'hello'
    }
}, {
    params: {
        query: 'there'
    }
});

// outputs {api: 1, params: {query: 'there'}}

এই উত্তরটি এখন সমুদ্রের এক ফোটা ...


সংক্ষিপ্ত উত্তরটি দুর্দান্ত কাজ করে! এটি আরও upvotes প্রাপ্য!
জেনস টার্নেল

8
var obj1 = { food: 'pizza', car: 'ford' }
var obj2 = { animal: 'dog' }

// result
result: {food: "pizza", car: "ford", animal: "dog"}

JQuery.extend () - লিঙ্ক ব্যবহার করে

// Merge obj1 & obj2 to result
var result1 = $.extend( {}, obj1, obj2 );

_.সম () - লিঙ্ক ব্যবহার করে

// Merge obj1 & obj2 to result
var result2 = _.merge( {}, obj1, obj2 );

_.Extend () - লিঙ্ক ব্যবহার করে

// Merge obj1 & obj2 to result
var result3 = _.extend( {}, obj1, obj2 );

অবজেক্ট.অ্যাসাইন () ইসমাস্ক্রিপ্ট 2015 (ES6) - লিঙ্ক ব্যবহার করে

// Merge obj1 & obj2 to result
var result4 = Object.assign( {}, obj1, obj2 );

সবার আউটপুট

obj1: { animal: 'dog' }
obj2: { food: 'pizza', car: 'ford' }
result1: {food: "pizza", car: "ford", animal: "dog"}
result2: {food: "pizza", car: "ford", animal: "dog"}
result3: {food: "pizza", car: "ford", animal: "dog"}
result4: {food: "pizza", car: "ford", animal: "dog"}

7

মার্কাস এবং ভিসিএনসি'র উত্তরের ভিত্তিতে এটি একটি প্রসারিত সংস্করণ। ফাংশনটি অনেকগুলি আর্গুমেন্ট নেয়। এটি ডিওমে বৈশিষ্ট্য নির্ধারণ করতে ব্যবহার করা যেতে পারে নোডগুলিতে এবং মানগুলির গভীর কপি তৈরি করে। যাইহোক, প্রথম যুক্তি রেফারেন্স দ্বারা দেওয়া হয়।

একটি ডম নোড সনাক্ত করতে, isDOMNode () ফাংশনটি ব্যবহৃত হয় (স্ট্যাক ওভারফ্লো প্রশ্ন জাভাস্ক্রিপ্ট isDOM দেখুন - একটি জাভাস্ক্রিপ্ট অবজেক্টটি কোনও ডোম অবজেক্ট কিনা তা আপনি কীভাবে পরীক্ষা করবেন? )

এটি অপেরাতে পরীক্ষা করা হয়েছিল 11, ফায়ারফক্স 6, ইন্টারনেট এক্সপ্লোরার 8 এ পরীক্ষা করা হয়েছিল এবং গুগল ক্রোম 16 এ পরীক্ষা করা হয়েছিল।

কোড

function mergeRecursive() {

  // _mergeRecursive does the actual job with two arguments.
  var _mergeRecursive = function (dst, src) {
    if (isDOMNode(src) || typeof src !== 'object' || src === null) {
      return dst;
    }

    for (var p in src) {
      if (!src.hasOwnProperty(p))
        continue;
      if (src[p] === undefined)
        continue;
      if ( typeof src[p] !== 'object' || src[p] === null) {
        dst[p] = src[p];
      } else if (typeof dst[p]!=='object' || dst[p] === null) {
        dst[p] = _mergeRecursive(src[p].constructor===Array ? [] : {}, src[p]);
      } else {
        _mergeRecursive(dst[p], src[p]);
      }
    }
    return dst;
  }

  // Loop through arguments and merge them into the first argument.
  var out = arguments[0];
  if (typeof out !== 'object' || out === null)
    return out;
  for (var i = 1, il = arguments.length; i < il; i++) {
    _mergeRecursive(out, arguments[i]);
  }
  return out;
}

কিছু উদাহরণ

অন্তর্নিহিত এইচটিএমএল এবং এইচটিএমএল উপাদানগুলির শৈলী সেট করুন

mergeRecursive(
  document.getElementById('mydiv'),
  {style: {border: '5px solid green', color: 'red'}},
  {innerHTML: 'Hello world!'});

অ্যারে এবং অবজেক্টগুলিকে মার্জ করুন। নোট করুন যে অপরিবর্তিত বাম হাতের অ্যারে / অবজেক্টে মান সংরক্ষণ করতে ব্যবহার করা যেতে পারে।

o = mergeRecursive({a:'a'}, [1,2,3], [undefined, null, [30,31]], {a:undefined, b:'b'});
// o = {0:1, 1:null, 2:[30,31], a:'a', b:'b'}

কোনও জাভাস্ক্রিপ্ট অবজেক্ট (নাল সহ) সরিয়ে না দেওয়ার কোনও যুক্তি উপেক্ষা করা হবে। প্রথম যুক্তি ব্যতীত, ডিওএম নোডগুলিও বাতিল করা হয়। সতর্ক থাকুন যে নতুন স্ট্রিংয়ের মতো তৈরি স্ট্রিংগুলি আসলে বস্তুগুলি are

o = mergeRecursive({a:'a'}, 1, true, null, undefined, [1,2,3], 'bc', new String('de'));
// o = {0:'d', 1:'e', 2:3, a:'a'}

আপনি যদি দুটি বস্তুকে নতুনতে মার্জ করতে চান (দুটির কোনওটির প্রভাব ছাড়াই) সরবরাহ করুন argument} প্রথম যুক্তি হিসাবে

var a={}, b={b:'abc'}, c={c:'cde'}, o;
o = mergeRecursive(a, b, c);
// o===a is true, o===b is false, o===c is false

সম্পাদন করা (রিপারসুন দ্বারা):

অ্যারেগুলিকেও মার্জ করতে

function mergeRecursive(obj1, obj2) {
  if (Array.isArray(obj2)) { return obj1.concat(obj2); }
  for (var p in obj2) {
    try {
      // Property in destination object set; update its value.
      if ( obj2[p].constructor==Object ) {
        obj1[p] = mergeRecursive(obj1[p], obj2[p]);
      } else if (Array.isArray(obj2[p])) {
        obj1[p] = obj1[p].concat(obj2[p]);
      } else {
        obj1[p] = obj2[p];
      }
    } catch(e) {
      // Property in destination object not set; create it and set its value.
      obj1[p] = obj2[p];
    }
  }
  return obj1;
}


5

আপনি lodash এর ব্যবহার করা উচিত defaultsDeep

_.defaultsDeep({ 'user': { 'name': 'barney' } }, { 'user': { 'name': 'fred', 'age': 36 } });
// → { 'user': { 'name': 'barney', 'age': 36 } }

5

সঙ্গে Underscore.js , বস্তু একটি অ্যারে একত্রীকরণ করুন:

var arrayOfObjects = [ {a:1}, {b:2, c:3}, {d:4} ];
_(arrayOfObjects).reduce(function(memo, o) { return _(memo).extend(o); });

এটির ফলাফল:

Object {a: 1, b: 2, c: 3, d: 4}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.