মার্জ করা অবজেক্টস (সহযোগী অ্যারে)


147

জাভাস্ক্রিপ্টে দুটি সহযোগী অ্যারে মার্জ করার সর্বোত্তম / মানক উপায় কী? সবাই কি কেবল নিজের forলুপটি ঘুরিয়ে এটি করে ?


10
জাভাস্ক্রিপ্ট বিটিডব্লুতে কোনও মিশ্রিত অ্যারে নেই, কেবলমাত্র অবজেক্ট।
gblazex

পার্ল মধ্যে Crossref একই প্রশ্ন: stackoverflow.com/questions/350018/...
dreftymac

জাভাস্ক্রিপ্টে সহযোগী অ্যারে: ডেভেলপার.মোজিলা.আর.ইন.ইউএস
ক্রিস মার্টিন

উত্তর:


204

jquery সঙ্গে আপনি কল করতে পারেন $.extend

var obj1 = {a: 1, b: 2};
var obj2 = {a: 4, c: 110};

var obj3 = $.extend(obj1, obj2); 

obj1 == obj3 == {a: 4, b: 2, c: 110} // Pseudo JS

(অ্যাসোসিয়েশন। অ্যারেগুলি জেসের মধ্যে বস্তু)

এখানে দেখুন: http://api.jquery.com/jQuery.extend/


সম্পাদনা: রাইমোর পরামর্শ মতো, এটি এভাবে করা ভাল better

obj3 = $.extend({}, obj1, obj2); 
obj3 == {a: 4, b: 2, c: 110}

যেমন এখানে আপত্তি 1 (এবং অবজেক্ট 2) অপরিবর্তিত রয়েছে।


edit2: 2018 এ করার উপায়টি এর মাধ্যমে Object.assign:

var obj3 = Object.assign({}, obj1, obj2); 
obj3 === {a: 4, b: 2, c: 110} // Pseudo JS

ES6 এর সাথে কাজ করা থাকলে স্প্রেড অপারেটরের মাধ্যমে এটি অর্জন করা যেতে পারে :

const obj3 = { ...obj1, ...obj2 };

54
বা obj1$.extend({}, obj1, obj2)
কৌতুক

হ্যাঁ, রেফারেন্স অনুসারে ক্লোজার এবং অবজেক্টগুলির সাথে কাজ করার সময় পরবর্তী ক্রিয়াকলাপগুলির জন্য মূল বিষয়টিকে প্রভাবিত করতে এড়াতে রাইমোর পরামর্শ নিন।
নাথান স্মিথ

2
আধুনিক ব্রাউজারগুলির জন্য, @ ম্যানফ্রেড ব্যবহার করে সমাধানটি পরীক্ষা করে দেখুন Object.assign(), যা আপনি যদি ইতিমধ্যে লাইব্রেরিটি ব্যবহার না করেন তবে JQuery এর উপর নির্ভর করে না।
ফিল

এটি কাজ করে, তবে এটি প্রথম প্যারামিটারটিকে পরিবর্তন করে এবং এটি আপনার সচেতন হওয়া দরকার। বিকাশকারী.মোজিলা.অর্গ.ওয়েেন
ইউএস

62

এখন ২০১ in-তে আমি বলব সর্বোত্তম / মানক উপায় হ'ল Object.assign ()
খাঁটি জাভাস্ক্রিপ্ট। কোন jQuery প্রয়োজন হয় না।

obj1 = {a: 1, b: 2};
obj2 = {a: 4, c: 110};
obj3 = Object.assign({},obj1, obj2);  // Object {a: 4, b: 2, c: 110}

আরও তথ্য, উদাহরণ এবং পলিফিল এখানে: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / অবজেক্ট / পাসপোর্ট


অবজেক্টের জন্য কী ধরণের? objজেক্ট 1 যদি আইএবিসি টাইপ হয়, তবে আপত্তি 3 কি পরে টাইপটি রাখবে?
উইন্ডোমায়াও

49

প্রোটোটাইপ এটি এটি করে:

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

উদাহরণস্বরূপ বলা হয়:

var arr1 = { robert: "bobby", john: "jack" };
var arr2 = { elizabeth: "liz", jennifer: "jen" };

var shortnames = Object.extend(arr1,arr2);

সম্পাদনা : যোগ করা হয়েছে ওপেনপ্রটি () মন্তব্যগুলিতে বুকাবায়ে যথাযথভাবে নির্দেশিত হিসাবে পরীক্ষা করুন


6
আপনি কেবলমাত্র তাত্ক্ষণিক বৈশিষ্ট্যগুলি অনুলিপি করেছেন তা নিশ্চিত করার জন্য আপনার পরীক্ষার উত্স হবে hasআপনার মালিকানা (সম্পত্তি)। যেমনটি হ'ল, এটি
অবজেক্ট.প্রোটোটাইপ

22

সহজবোধ্য রাখো...

function mergeArray(array1,array2) {
  for(item in array1) {
    array2[item] = array1[item];
  }
  return array2;
}

6
arrau1.prototype
লিগিজি

@ লিগি ঠিক আছে আপনার এই hasOwnPropertyচেক দরকার অ্যারে হিসাবে বস্তুগুলি উল্লেখ করাও বিভ্রান্তিমূলক (তারা বস্তু), আর্গের নামগুলি বোঝাতে হবে যে অ্যারে 2 পরিবর্তন করা হয়েছে বা একটি নতুন অবজেক্ট ফিরিয়ে দেওয়া উচিত। আমি উত্তরটি সম্পাদনা করব তবে বাস্তবে এটি জনাথন ফিংল্যান্ডের সম্পাদিত উত্তর হয়ে উঠবে যা ইতিমধ্যে সংশোধন করা হয়েছে।
ওয়াজ

14

ইনসকোরের একটি বর্ধিত পদ্ধতি রয়েছে:

উত্স অবজেক্টের সমস্ত বৈশিষ্ট্যকে গন্তব্য অবজেক্টে অনুলিপি করুন। এটি ক্রমযুক্ত, সুতরাং শেষ উত্সটি পূর্ববর্তী যুক্তিগুলিতে একই নামের বৈশিষ্ট্যগুলিকে ওভাররাইড করবে।

_.extend(destination, *sources) 

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


6

নামগুলি একই তবে মানগুলি না থাকলে আপনি কি কোনও সম্পত্তি ওভাররাইট করতে চান?

এবং আপনি কি স্থায়ীভাবে কোনও আসল বস্তুতে পরিবর্তন করতে চান,

অথবা আপনি কি নতুন মার্জ করা বস্তুটি ফেরত চান?

function mergedObject(obj1, obj2, force){
    for(var p in obj1) this[p]= obj1[p];
    for(var p in obj2){
        if(obj2.hasOwnProperty(p)){
            if(force || this[p]=== undefined) this[p]= obj2[p];
            else{
                n= 2;
                while(this[p+n]!== undefined)++n;
                this[p+n]= obj2[p];
            }
        }
    }
}

6

আপনার নিজস্ব প্রসারিত / মিক্সিন ফাংশন রোলিং

function extend(objects) {
    var args
        , first = Array.prototype.slice.call(arguments, 0, 1)[0]
        , second;

    if (arguments.length > 1) {
        second = Array.prototype.splice.call(arguments, 1, 1)[0];
        for (var key in second) {
            first[key] = second[key];
        }
        args = Array.prototype.slice.call(arguments, 0);
        return extend.apply(this, args);
    }

    return first;
}

...

var briansDirections = {
    step1: 'Remove pastry from wrapper.',
    step2: 'Place pastry toaster.',
    step3: 'Remove pastry from toaster and enjoy.',
};
extend(briansDirections, { step1: 'Toast Poptarts' }, { step2: 'Go ahead, toast \'em' }, { step3: 'Hey, are you sill reading this???' });

...

এটি কেবল পুনরাবৃত্তভাবে বস্তুর একটি স্প্লট প্রসারিত করে । এছাড়াও, মনে রাখবেন যে এই পুনরাবৃত্তি ফাংশনটি টিসিও ( টেল-কল অপ্টিমাইজড ) হওয়ায় এটির ফিরে আসা নিজের কাছে শেষ কল।

অতিরিক্তভাবে, আপনি লক্ষ্যযুক্ত বৈশিষ্ট্যগুলি পেতে পারেন । এই ক্ষেত্রে, আপনি উপর ভিত্তি করে অবজেক্টগুলি ঘনীভূত করতে চাইতে পারেন id,quantity অথবা অন্য সম্পত্তি। এই পদ্ধতির এটি সম্পর্কে একটি ছোট্ট বই লেখা থাকতে পারে এবং এতে অবজেক্ট-জুস্টেপেজ অবস্থান প্রয়োজন এবং এটি খুব জটিল হয়ে উঠতে পারে। আমি এটির জন্য একটি ছোট লাইব্রেরি লিখেছি যা অনুরোধের ভিত্তিতে পাওয়া যায়।

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


4
  1. জাভাস্ক্রিপ্টে এসোসিয়েটিভ অ্যারের কোনও ধারণা নেই, বস্তু রয়েছে
  2. দুটি অবজেক্টকে একীভূত করার একমাত্র উপায় হ'ল তাদের বৈশিষ্ট্যগুলির লুপ করা এবং তাদের মানগুলিতে পয়েন্টারগুলি অনুলিপি করা যা আদিম ধরণের নয় এবং অন্য কোনও উদাহরণে আদিম ধরণের মানগুলি copy

8
জাভাস্ক্রিপ্টে অবজেক্টগুলি
মিশ্র

2

2019 এ আপনার কাছে দুটি ভাল বিকল্প রয়েছে:

বস্তু বরাদ্দকরণ [ ডক ]

const result = Object.assign({}, baseObject, updatingObject);

বস্তু ছড়িয়ে দেওয়া [ ডক ]

const result = { ...baseObject, ...updatingObject};

প্রথমটি সুরক্ষিত, আরও মানক এবং বহুগুণিত হতে থাকে। একটি ভাল ভাল এবং কনস এখানে


1

ইয়াহু ইউআই (ওয়াইউআই) এরও এর জন্য একটি সহায়ক ফাংশন রয়েছে:

http://developer.yahoo.com/yui/examples/yahoo/yahoo_merge.html

YAHOO.namespace('example');

YAHOO.example.set1 = { foo : "foo" };
YAHOO.example.set2 = { foo : "BAR", bar : "bar" };
YAHOO.example.set3 = { foo : "FOO", baz : "BAZ" };

var Ye = YAHOO.example;

var merged = YAHOO.lang.merge(Ye.set1, Ye.set2, Ye.set3);

1

গভীর কপির জন্য jquery এর একটি বুলিয়ান রয়েছে। আপনি এরকম কিছু করতে পারেন:

MergeRecursive = function(arr1, arr2){
    $.extend(true, arr1, arr2);
    return arr1;                
};

এছাড়াও আপনি মার্জ করতে এন-অ্যারে সমর্থন করতে এই ফাংশনটি সম্পাদনা করতে পারেন।

ArrayMergeRecursive = function(){
     if(arguments.length < 2){
          throw new Error("ArrayMergeRecursive: Please enter two or more objects to merge!");
     }

    var arr1=arguments[0];
    for(var i=0; i<=arguments.length; i++ ){
        $.extend(true, arr1, arguments[i]);                 
    }

    return arr1;                
};

সুতরাং এখন আপনি করতে পারেন

var arr1 = {'color': {'mycolor': 'red'}, 3: 5},
    arr2 = {4: 10, 'color': {'favorite': 'green', 0: 'blue'}},
    arr3 = ['Peter','Jhon','Demosthenes'],
    results = ArrayMergeRecursive(arr1, arr2, arr3); // (arr1, arr2 ... arrN)
console.log("Result is:", results);

0

আমার একটি গভীর-বস্তু-মার্জ করা দরকার। সুতরাং অন্যান্য উত্তরগুলি আমার খুব একটা সহায়তা করে নি। _.কাণ্ড এবং jQuery.extend আপনার মতো আমার মতো পুনরাবৃত্ত অ্যারে না থাকলে ভাল করে। তবে এটি এতটা খারাপ নয়, আপনি এটি পাঁচ মিনিটের মধ্যে প্রোগ্রাম করতে পারেন:

var deep_merge = function (arr1, arr2) {
    jQuery.each(arr2, function (index, element) {
        if (typeof arr1[index] === "object" && typeof element === "object") {
            arr1[index] = deep_merge(arr1[index], element);
        } else if (typeof arr1[index] === "array" && typeof element === "array") {
            arr1[index] = arr1[index].concat(element);
        } else {
            arr1[index] = element;
        }
    });
    return arr1;
}

0

JQuery এ অ্যারেগুলিকে মার্জ করতে what। মিমের কী?

var merged = $.merge([{id:3, value:'foo3'}], [{id:1, value:'foo1'}, {id:2, value:'foo2'}]);
merged[0].id == 3;
merged[0].value == 'foo3';
merged[1].id == 1;
merged[1].value == 'foo1';
merged[2].id == 2;
merged[2].value == 'foo2';

0

পুনরাবৃত্তির সমাধান (বস্তুর অ্যারেগুলিও প্রসারিত করে) + নাল চেক করা হয়েছে ull

var addProps = function (original, props) {
    if(!props) {
        return original;
    }
    if (Array.isArray(original)) {
        original.map(function (e) {
            return addProps(e, props)
        });
        return original;
    }
    if (!original) {
        original = {};
    }
    for (var property in props) {
        if (props.hasOwnProperty(property)) {
            original[property] = props[property];
        }
    }
    return original;
};

টেস্ট

console.log(addProps([{a: 2}, {z: 'ciao'}], {timestamp: 13}));
console.log(addProps({single: true}, {timestamp: 13}));
console.log(addProps({}, {timestamp: 13}));
console.log(addProps(null, {timestamp: 13}));

[ { a: 2, timestamp: 13 }, { z: 'ciao', timestamp: 13 } ]
{ single: true, timestamp: 13 }
{ timestamp: 13 }
{ timestamp: 13 }

আমি নোড জেএস দিয়ে এটি ব্যবহার করার চেষ্টা করেছি, তবে Object.getOwnPropertyNames is not a functionঅ্যাপটি ক্র্যাশ করবে।
লেগোলেস

আমি plv8 PostgreSQL এক্সটেনশনের মধ্যে কিছু পুরানো ভি 8 ইঞ্জিন সহ এটি ব্যবহার করছি। এবং এটি ব্রাউজারগুলিতে কাজ করে। আপনার জেএস ইঞ্জিনে "hasOwnProperty" হিসাবে সমতুল্য কাজ করার জন্য একটি উপায় সন্ধান করুন। তারপরে আপনি এই যুক্তিটি পুনরায় ব্যবহার করতে পারেন।
sscarduzio

0

এখানে সেরা সমাধান।

obj1.unshift.apply( obj1, obj2 );

এছাড়াও, obj1কোনও সমস্যা ছাড়াই একটি লুপের ভিতরে বাড়তে পারে। (বলুন obj2গতিশীল)

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