বস্তুর 2 অ্যারে মার্জ করুন


112

একটি উদাহরণ দেখুন।

var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});

আমার সেই 2 টি অ্যারে অবজেক্টের মিশ্রিত করতে হবে এবং নিম্নলিখিত অ্যারে তৈরি করতে হবে:

arr3 = new Array({name: "lang", value: "German"}, {name: "age", value: "18"}, {name : "childs", value: '5'});

এটি করার জন্য কোনও জাভাস্ক্রিপ্ট বা jQuery ফাংশন আছে?

$.extendআমার মামলা হয় না। এটি ফিরে আসে

arr4 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});

15
কি হয়েছে {name: "lang", value: "English"}?
শেডো উইজার্ড আপনার পক্ষে কান

দুঃখিত। আমি ment। প্রসারিত, না merge।
আলেকজান্ডার

1
মানে, যুক্তি যুক্ত কী? আপনি কীভাবে অ্যারেগুলিকে মার্জ করতে চান? এটি আপনার উদাহরণ থেকে পরিষ্কার নয়।
শেডো উইজার্ড আপনার পক্ষে কান

সবাইকে অনেক ধন্যবাদ। আমি নিজেই এটি করেছি।
আলেকজান্ডার

6
@ শ্যাডো উইজার্ড, আমি মনে করি ওপি বলতে কী বোঝায় তা যদি বিদ্যমান থাকে তবে আপডেট হয়েছিল এবং তা না হলে ধাক্কা।
আমিন মোহাম্মদ আজানী

উত্তর:


84

আপনি যদি জাভাস্ক্রিপ্টে 2 টি অ্যারে অবজেক্ট করতে চান। আপনি এই ওয়ান লাইন কৌশলটি ব্যবহার করতে পারেন

Array.prototype.push.apply(arr1,arr2);

উদাহরণ স্বরূপ

var arr1 = [{name: "lang", value: "English"},{name: "age", value: "18"}];
var arr2 = [{name : "childs", value: '5'}, {name: "lang", value: "German"}];

Array.prototype.push.apply(arr1,arr2); 

console.log(arr1);  // final merged result will be in arr1

আউটপুট:

[{"name":"lang","value":"English"},
{"name":"age","value":"18"},
{"name":"childs","value":"5"},
{"name":"lang","value":"German"}]

এটি এখন পর্যন্ত সবচেয়ে সহজ ব্যবহার এবং ঠিক কাজ করে works এটি ভাগ করে নেওয়ার জন্য ধন্যবাদ।
লিও ক্যাসিরো

17
খুব সহজ হিসাবে একই ফলাফল:arr1 = arr1.concat(arr2)
কেইথপজললি

7
তবে এটি একীভূত হয় না!
দিমিত্রি কোপরিওয়া

1
ফলাফল এক নয়। concatএকটি নতুন অ্যারে ফিরে আসবে এবং আপনার যে কোনও রেফারেন্স ভঙ্গ হবে।
বাইপেইন্টার

8
এটি প্রশ্নের উত্তর দেয় না, ফলস্বর অ্যারেটিতে 3 টি অবজেক্ট থাকা উচিত 4 আপনি নমুনার মান পরিবর্তন করেছেন। মূলত ওপি যা চায় তা হ'ল দুটি অবজেক্ট অ্যারেগুলিকে একীভূত করা এবং সদৃশ মানগুলি সরানো।
রঞ্জন

43

ES6 এর সাহায্যে আপনি নীচের মতো এটি খুব সহজেই করতে পারেন:

var arr1 = new Array({name: "lang", value: "German"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
var arr3 = [...arr1, ...arr2];

আউটপুট:

    arr3 = [
      {"name":"lang","value":"German"},
      {"name":"age","value":"18"},
      {"name":"childs","value":"5"},
      {"name":"lang","value":"German"}
    ]

6
এটি শীর্ষ উত্তর হওয়া উচিত।
নোকডিব

20
এটি ওপি যা খুঁজছিল তা করে না, সেখানে কোনও দ্বিতীয় অবজেক্ট থাকা উচিত নয়{ name: 'lang', value: 'German'}
উইল

3
এই উত্তরটি কেন ভোট দেওয়া হয়েছে তা আমি জানি না। @ ডেভেন্ডারসন ৮৮ যা চান তা এই উত্তর থেকে আলাদা।
Nguyễn Xuân Hoàng

33

যারা আধুনিক জিনিস নিয়ে পরীক্ষা নিরীক্ষা করছেন:

var odd = [
    { name : "1", arr: "in odd" },
    { name : "3", arr: "in odd" }
];

var even = [
    { name : "1", arr: "in even" },
    { name : "2", arr: "in even" },
    { name : "4", arr: "in even" }
];

// ----
// ES5 using Array.filter and Array.find
function merge(a, b, prop){
  var reduced = a.filter(function(aitem){
      return ! b.find(function(bitem){
          return aitem[prop] === bitem[prop];
      });
  });
  return reduced.concat(b);
}
console.log( "ES5", merge(odd, even, "name") );

// ----
// ES6 arrow functions
function merge(a, b, prop){
    var reduced =  a.filter( aitem => ! b.find ( bitem => aitem[prop] === bitem[prop]) )
  return reduced.concat(b);
}
console.log( "ES6", merge(odd, even, "name") );

// ----
// ES6 one-liner
var merge = (a, b, p) => a.filter( aa => ! b.find ( bb => aa[p] === bb[p]) ).concat(b);


console.log( "ES6 one-liner", merge(odd, even, "name") );

// Results
// ( stuff in the "b" array replaces things in the "a" array )
// [
//    {
//         "name": "3",
//         "arr": "in odd"
//     },
//     {
//         "name": "1",
//         "arr": "in even"
//     },
//     {
//         "name": "2",
//         "arr": "in even"
//     },
//     {
//         "name": "4",
//         "arr": "in even"
//     }
// ]

29

আপডেট 12 অক্টোবর 2019

কেবলমাত্র নতুন জাভাস্ক্রিপ্টের উপর ভিত্তি করে এবং কোনও তৃতীয় পক্ষের লাইব্রেরির প্রয়োজন ছাড়াই নতুন সংস্করণ।

const mergeByProperty = (target, source, prop) => {
  source.forEach(sourceElement => {
    let targetElement = target.find(targetElement => {
      return sourceElement[prop] === targetElement[prop];
    })
    targetElement ? Object.assign(targetElement, sourceElement) : target.push(sourceElement);
  })
}
var target /* arr1 */ = [{name: "lang", value: "English"}, {name: "age", value: "18"}];
var source /* arr2 */ = [{name : "childs", value: '5'}, {name: "lang", value: "German"}];

mergeByProperty(target, source, 'name');

console.log(target)

এই উত্তরটি পুরানো হয়ে উঠছিল, আজকাল লোডাশ এবং আন্ডারস্কোরের মতো লিবসের খুব কম প্রয়োজন। এই নতুন সংস্করণে, লক্ষ্য (arr1) অ্যারেটি আমরা এক সাথে কাজ করছি এবং তা আপ টু ডেট রাখতে চাই। উৎস (arr2) অ্যারে যেখানে নতুন তথ্য থেকে আসছে, এবং আমরা এটা আমাদের মধ্যে মিশে গিয়ে তৈরি চান লক্ষ্য অ্যারে।

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


আন্ডারস্কোর বা লোডাশ ব্যবহার করে পুরানো উত্তর

আমি সবসময় গুগল থেকে এখানে পৌঁছে যাই এবং আমি সবসময় উত্তর থেকে সন্তুষ্ট না। আপনার উত্তরটি ভাল তবে আন্ডারস্কোর.জেএস ব্যবহার করে এটি সহজ এবং পরিষ্কার হবে

ডেমো: http://jsfiddle.net/guya/eAWKR/

এখানে আরও সাধারণ ফাংশন যা তাদের বস্তুর সম্পত্তি ব্যবহার করে 2 অ্যারে মার্জ করবে। এক্ষেত্রে সম্পত্তি 'নাম'

var arr1 = [{name: "lang", value: "English"}, {name: "age", value: "18"}];
var arr2 = [{name : "childs", value: '5'}, {name: "lang", value: "German"}];

function mergeByProperty(arr1, arr2, prop) {
  _.each(arr2, function(arr2obj) {
    var arr1obj = _.find(arr1, function(arr1obj) {
      return arr1obj[prop] === arr2obj[prop];
    });

    arr1obj ? _.extend(arr1obj, arr2obj) : arr1.push(arr2obj);
  });
}

mergeByProperty(arr1, arr2, 'name');

console.log(arr1);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.core.min.js"></script>

[{name: "lang", value: "German"}, {name: "age", value: "18"}, {name : "childs", value: '5'}]

6
এলওসি-তে প্রায় অভিন্ন, @ ইউআর এর উত্তর হিসাবে জটিলতা, ব্যতীত এটি অনেক ধীর (মূলত অতিরিক্ত ফাংশন কলের কারণে এবং আপনার উত্তরটি জেএস এসোসিয়েটিভ অ্যারে কৌশলকে ও (1) লুক্কুট সহ আইটেমগুলি সন্ধান করার জন্য ব্যবহার করে) এটি আপনার অতিরিক্ত গ্রন্থাগার আনার প্রয়োজন ছাড়াও।
মিচিফ

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

1
@ গুয়া আমি বুঝতে পারি যে এটি পুরানো তবে আন্ডারস্কোর, লোডাশ এবং একইভাবে ইতিমধ্যে ব্যবহৃত হয় এবং এর অন্যান্য সুবিধাগুলি রয়েছে যখন আপনি বলছেন যে তাদের অন্যান্য সুবিধাগুলি রয়েছে, এটি সাধারণভাবে ইতিমধ্যে ব্যবহৃত হয়েছে বলে এটি একটি বিশাল ধারণা।
ক্র্যাকারজ্যাক

26
var arr3 = [];
for(var i in arr1){
   var shared = false;
   for (var j in arr2)
       if (arr2[j].name == arr1[i].name) {
           shared = true;
           break;
       }
   if(!shared) arr3.push(arr1[i])
}
arr3 = arr3.concat(arr2);

এখানে চিত্র বর্ণনা লিখুন


1
এই উত্তরে খারাপ সময় জটিলতা রয়েছে (O (n ^ 2))। একটি হ্যাশ মানচিত্র ব্যবহার করে একটি ও (এন) সমাধান সম্ভব।
অ্যালেক্স ভন ব্র্যান্ডেনফেল

18

ES6 স্প্রেড অপারেটরটি ব্যবহার করে খুব সাধারণ:

const array1 = [{a: 'HI!'}, {b: 'HOW'}]
const array2 = [{c: 'ARE'}, {d: 'YOU?'}]

const mergedArray = [ ...array1, ...array2 ]
console.log('Merged Array: ', mergedArray)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

Merged Array: [ {a: 'HI!'}, {b: 'HOW'} {c: 'ARE'}, {d: 'YOU?'} ]

দ্রষ্টব্য: উপরের সমাধানটি কেবল ES6 স্প্রেড অপারেটর ব্যবহার করে দুটি অ্যারে মার্জ করা।

@ Bh4r4th দ্বারা 07 জানুয়ারী 2020 এ সম্পাদনা করুন: আমার প্রাথমিক সমাধানের পরে সম্পাদনার কারণে প্রসঙ্গটি বদলে গেছে। আমি বর্তমান মানদণ্ডের সাথে মেলে আমার সমাধানটি আপডেট করতে চাই। অর্থাত,

  1. সদৃশ অবজেক্ট তৈরি না করে অ্যারে অবজেক্টগুলি মার্জ করুন এবং,

  2. সম্পত্তিটি ইতিমধ্যে পূর্বের অ্যারেটিতে উপস্থিত valueথাকলে আপডেট করুনname

const arr1 = [
    { name: "lang", value: "English" },
    { name: "age", value: "18" }
]
const arr2 = [
    { name: "childs", value: '2' }, 
    { name: "lang", value: "German" }
]
const arr3 = [
    { name: "lang", value: "German" },
    { name: "age", value: "28" },
    { name: "childs", value: '5' }
]

// Convert to key value dictionary or object
const convertToKeyValueDict = arrayObj => {
    const val = {}
    arrayObj.forEach(ob => {
        val[ob.name] = ob.value
    })
    return val
}

// update or merge array
const updateOrMerge = (a1, a2) => {
    const ob1 = convertToKeyValueDict(a1)
    const ob2 = convertToKeyValueDict(a2)
    // Note: Spread operator with objects used here
    const merged_obj = {...ob1, ...ob2}
    const val = Object.entries(merged_obj)
    return val.map(obj => ({ name: obj[0], value: obj[1] }))
}

const v1 = updateOrMerge(arr1, arr2)
const v2 = updateOrMerge(v1, arr3)
console.log(`Merged array1 and array2: ${JSON.stringify(v1)} \n\n`)
console.log(`Merged above response and array3: ${JSON.stringify(v2)} \n\n`)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>


1
এটি 2019 সালে গৃহীত উত্তর হওয়া উচিত! উচ্চতর ভোট গণনা সহ অন্যান্য উত্তরগুলি দেখার পরে আমি একই সমাধানটির প্রস্তাব দিতে যাচ্ছিলাম! @ আলেকজান্ডার এটি মিস করা সহজ তবে দয়া করে এটি গ্রহণ করুন!
iafork

ত্রুটিপূর্ণ. প্রশ্নকারী নির্দিষ্টভাবে বস্তুগুলিকে পুনরায় প্রতিস্থাপন করতে চায় যদি তাদের ডুপ্লিকেট সম্পত্তি থাকে, কেবল সেগুলি সংযোজন না করে।
HaveSpacesuit

এই টুইটটি দেখানোর জন্য ধন্যবাদ @ হ্যাভস্পেসেসুট। প্রসঙ্গটি কেবল দুটি অ্যারে মার্জ করার জন্য আমি এই প্রশ্নের উত্তর 2018 সালে দিয়েছি। setসদৃশগুলি সরানোর জন্য মার্জ করার পরে শীঘ্রই এই উত্তরটি সম্পাদনা করবে । এটি নতুন পরিবর্তনশীল যুক্তি তৈরি করবে তবে ন্যূনতম কোড। তবে, আমি পে-লোডের কোনও বড় অনুরাগী নই যার নামগুলি বিভিন্ন ধরণের হিসাবে বৈশিষ্ট্য এবং মান হিসাবে সংজ্ঞায়িত করা হয়েছে। পরিবর্তে আমি পছন্দ [ { lang: &#39;German&#39;, age: 25}] । পরিষেবাগুলির মধ্যে যোগাযোগের সময় এইভাবে পেডলোড ওজন হ্রাস করা হবে।
bh4r4th

আমি এখন প্রশ্নের পরিবর্তিত প্রসঙ্গে মেলে সমাধানটি আপডেট করেছি।
bh4r4th

16

দুটি অ্যারে মার্জ করা:

var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
var result=arr1.concat(arr2);
// result: [{name: "lang", value: "English"}, {name: "age", value: "18"}, {name : "childs", value: '5'}, {name: "lang", value: "German"}]

'নাম' এর জন্য সদৃশ মান ব্যতীত দুটি অ্যারে মার্জ করা:

var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
var i,p,obj={},result=[];
for(i=0;i<arr1.length;i++)obj[arr1[i].name]=arr1[i].value;
for(i=0;i<arr2.length;i++)obj[arr2[i].name]=arr2[i].value;
for(p in obj)if(obj.hasOwnProperty(p))result.push({name:p,value:obj[p]});
// result: [{name: "lang", value: "German"}, {name: "age", value: "18"}, {name : "childs", value: '5'}]

অ্যারে.কনক্যাট হ'ল 2 টি অ্যারে একত্রে মিশ্রিত করার উপযুক্ত উপায়। আমি বর্ধিত অনুমানটিও পছন্দ করি যে "সত্য" সংশ্লেষের ধারণাটি সম্বোধন করা হয়েছিল (প্রতিটি অ্যারের উপাদানটির প্রদত্ত কীটির উপর ভিত্তি করে)।
বব

14

সবচেয়ে সহজ উপায়টি কয়েকটি ES6 যাদু দ্বারা:

সদৃশ দুটি দিয়ে মার্জ করুন:

const a = [{a: 1}, {b: 2}]
const b = [{a: 1}]

const result = a.concat(b) // [{a: 1}, {b: 2}, {a: 1}]

সদৃশ ছাড়াই এটি উপরের প্লাসের সমান:

const distinct = [...new Set(result.map(item => item.YOUR_PROP_HERE))]



7

লোডাস সহ:

_.uniqBy([...arr1, ...arr2], 'name')

যে ES6 সিনট্যাক্স 2 টি অ্যারে নিয়ে কাজ করে, 2 টি অ্যারে অবজেক্টের সাথে নয়।
দারিও

7

এইভাবে আমি একটি ES6 প্রসঙ্গে একই জাতীয় সমস্যাটিকে মোকাবিলা করেছি:

function merge(array1, array2, prop) {
    return array2.map(function (item2) {
        var item1 = array1.find(function (item1) {
            return item1[prop] === item2[prop];
        });
        return Object.assign({}, item1, item2);
    });
}

দ্রষ্টব্য: এই পদ্ধতির অ্যারে 1 থেকে এমন কোনও আইটেম ফিরে আসবে না যা অ্যারে 2 তে উপস্থিত হবে না।


সম্পাদনা: আমার এমন কিছু পরিস্থিতি রয়েছে যেখানে আমি আইটেমগুলি সংরক্ষণ করতে চাই যা দ্বিতীয় অ্যারেতে দেখা যায় না তাই আমি অন্য পদ্ধতিটি নিয়ে এসেছি।

function mergeArrays(arrays, prop) {
    const merged = {};

    arrays.forEach(arr => {
        arr.forEach(item => {
            merged[item[prop]] = Object.assign({}, merged[item[prop]], item);
        });
    });

    return Object.values(merged);
}

var arr1 = [
    { name: 'Bob', age: 11 },
    { name: 'Ben', age: 12 },
    { name: 'Bill', age: 13 },
];

var arr2 = [
    { name: 'Bob', age: 22 },
    { name: 'Fred', age: 24 },
    { name: 'Jack', age: 25 },
    { name: 'Ben' },
];

console.log(mergeArrays([arr1, arr2], 'name'));

6

তবুও অন্য সংস্করণ ব্যবহার করে reduce() method:

var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});

var arr = arr1.concat(arr2).reduce(function(prev, current, index, array){ 
   
   if(!(current.name in prev.keys)) {
      prev.keys[current.name] = index;
      prev.result.push(current);   
   } 
   else{
       prev.result[prev.keys[current.name]] = current;
   }  

   return prev;
},{result: [], keys: {}}).result;
  
document.getElementById("output").innerHTML = JSON.stringify(arr,null,2);    
<pre id="output"/>


এটি আমার জন্য কাজ করে মহান। একটি ছোট সমস্যা যদিও
অর্ডারটি

5

সহজ সমাধান

var tx = [{"id":1},{"id":2}];
var tx1 = [{"id":3},{"id":4}];


var txHistory = tx.concat(tx1)

console.log(txHistory); 
// output
 // [{"id":1},{"id":2},{"id":3},{"id":4}];

4

সদৃশগুলি প্রতিস্থাপনের সময় আপনি আপনার সম্পত্তি সংগ্রহ করতে কোনও বস্তু ব্যবহার করতে পারেন এবং তারপরে সেই বস্তুকে অ্যারেতে প্রসারিত / সমতল করতে পারেন। এটার মতো কিছু:

function merge(args) {
    args  = Array.prototype.slice.call(arguments);
    var o = { };
    for(var i = 0; i < args.length; ++i)
        for(var j = 0; j < args[i].length; ++j)
            o[args[i][j].name] = args[i][j].value;
    return o;
}

function expand(o) {
    var a = [ ];
    for(var p in o)
        if(o.hasOwnProperty(p))
            a.push({ name: p, value: o[p]});
    return a;
}

var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
var arr3 = expand(merge(arr1, arr2));

আমি জানি না এটি সবচেয়ে দ্রুততর উপায় কিনা তবে এটি কোনও সংখ্যক ইনপুট অ্যারেগুলির জন্য কাজ করে; উদাহরণস্বরূপ, এটি:

var a = expand(
    merge(
        [{name: "lang", value: "English"}, {name: "age", value: "18"}],
        [{name: "childs", value: '5'}, {name: "lang", value: "German"}],
        [{name: 'lang', value: 'Pancakes'}]
    )
);

aযেটি ছিল তাতে আপনাকে একই জিনিস দেয়arr3 "জার্মান" "প্যানকেকস" দ্বারা প্রতিস্থাপিত হয়।

এই পদ্ধতির ধরে নেওয়া যায় না যে আপনার সমস্ত বস্তুর {name: ..., value: ...}অবশ্যই একই রকম রয়েছে।

আপনি এটি এখানে কাজ করে দেখতে পারেন (দয়া করে আপনার কনসোলটি খুলুন): http://jsfiddle.net/ambiguous/UtBbB/


2

JQuery মার্জ সম্পর্কে কি?

http://api.jquery.com/jQuery.merge/

jsFood উদাহরণ এখানে: http://jsfiddle.net/ygByD/


এটি নির্দিষ্ট হিসাবে জার্মানের সাথে ইংরেজি প্রতিস্থাপন করবে না, nameবৈশিষ্ট্যগুলি সহ একীভূত হচ্ছে ।
মিউ খুব ছোট

হ্যাঁ, আপনি ঠিক বলেছেন! সেই স্পেসিফিকেশন আমি এক নজরে দেখিনি!
321 এক্স

+1 টি। আমরা হব! অন্যদিকে বস্তুগুলির জাভাস্ক্রিপ্ট অ্যারেগুলিকে একীভূত করা বেশ ভাল কাজ
মুহাম্মদ রহিল

2

আমি একই সমস্যার মুখোমুখি হয়েছি এবং গুয়া উত্তরের উপর ভিত্তি করে আমি আন্ডারস্কোর লাইব্রেরিটি প্রসারিত করেছি এবং আরও কিছু কার্যকারিতা যুক্ত করেছি যা আমার প্রয়োজন ছিল। এখানে সারকথা

/**
 * Merges two object-like arrays based on a key property and also merges its array-like attributes specified in objectPropertiesToMerge.
 * It also removes falsy values after merging object properties.
 *
 * @param firstArray The original object-like array.
 * @param secondArray An object-like array to add to the firstArray.
 * @param keyProperty The object property that will be used to check if objects from different arrays are the same or not.
 * @param objectPropertiesToMerge The list of object properties that you want to merge. It all must be arrays.
 * @returns The updated original array.
 */
function merge(firstArray, secondArray, keyProperty, objectPropertiesToMerge) {

    function mergeObjectProperties(object, otherObject, objectPropertiesToMerge) {
        _.each(objectPropertiesToMerge, function (eachProperty) {
            object[eachProperty] = _.chain(object[eachProperty]).union(otherObject[eachProperty]).compact().value();
        });
    }

    if (firstArray.length === 0) {
        _.each(secondArray, function (each) {
            firstArray.push(each);
        });
    } else {
        _.each(secondArray, function (itemFromSecond) {
            var itemFromFirst = _.find(firstArray, function (item) {
                return item[keyProperty] === itemFromSecond[keyProperty];
            });

            if (itemFromFirst) {
                mergeObjectProperties(itemFromFirst, itemFromSecond, objectPropertiesToMerge);
            } else {
                firstArray.push(itemFromSecond);
            }
    });
    }

    return firstArray;
}

_.mixin({
            merge: merge
        });

আশা করি এটি কার্যকর হবে! শুভেচ্ছা সহ!


2

আমি সম্প্রতি এই সমস্যাটি নিয়ে স্ট্যাম্পড হয়েছি এবং আমি উত্তর পাওয়ার আশা নিয়ে এখানে এসেছি তবে গ্রহণযোগ্য উত্তরটি লুপগুলিতে 2 ব্যবহার করে যা আমি পছন্দ করি না। আমি অবশেষে আমার নিজের তৈরি করতে পরিচালিত। কোনও লাইব্রেরির উপর নির্ভর করে না:

function find(objArr, keyToFind){
    var foundPos = objArr.map(function(ob){
        return ob.type;
    }).indexOf(keyToFind);
    return foundPos;
}

function update(arr1,arr2){
    for(var i = 0, len = arr2.length, current; i< len; i++){
        var pos = find(arr1, arr2[i].name); 
        current = arr2[i];
        if(pos !== -1) for(var key in arr2) arr1[pos][key] = arr2[key];
        else arr1[arr1.length] = current;
    } 
}

এটি এআর 1 এর ক্রমও বজায় রাখে।


2

আপনি নিম্নলিখিত ফাংশন ব্যবহার করতে পারে

const merge = (a, b, key = "id") =>
  a.filter(elem => !b.find(subElem => subElem[key] === elem[key]))
   .concat(b);

এবং চেষ্টা কর

merge(arr1, arr2, 'name');

ES6 অপরিবর্তনীয় বৈশিষ্ট্য ia `` রফতানির জন্য একীভূতকরণ MergeArrays = (এ 1, এ 2, কী = "আইডি") => এ 1 && এ 2! = নাল? [... a1.filter (a =>! a2.find (p => p [key] === a [key])), ... a2]: নাল; `` `
মুসা

1

এখানে arr1উপস্থিত থাকা arr2বা না থাকা উপাদানগুলির ভিত্তিতে আমি প্রথমে ফিল্টার করি । যদি এটি উপস্থিত থাকে তবে ফলস্বর অ্যারেতে এটি যুক্ত করবেন না অন্যথায় যুক্ত করুন। এবং তারপরে আমি ফলাফলটিতে সংযোজন করি arr2

arr1.filter(item => {
  if (!arr2.some(item1=>item.name==item1.name)) {
    return item
  }
}).concat(arr2)

দয়া করে আপনার উত্তরের ব্যাখ্যা সরবরাহ করুন। সুতরাং অন্য কোনও ব্যক্তি যদি প্রশ্নোত্তর পড়ে তবে তা সহজেই বুঝতে পারবেন।
মিতল প্যাটেল

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

তোমাদেরকে ধন্যবাদ. আমি সমাধান বর্ণনা আপডেট। যদি এটি সঠিক মনে হয় :) দয়া করে :)
মৌলিক ভাট

0

আমার মাথার উপরের অংশটি বন্ধ করুন - jquery প্রসারিত করে দেখুন

var arr3 = jQuery.extend(arr1,arr2....)

দুঃখিত। ঠিক এই ফাংশনটি arr4 প্রদান করে। না merge .ডম। শেষটি আমার পক্ষেও উপযুক্ত নয়, কারণ এটি বস্তুগুলিকে নকল করে।
আলেকজান্ডার

0

var newArray = yourArray.concat(otherArray); console.log('Concatenated newArray: ', newArray);


আমি সম্মত হই যে এটি Array.protype.push.apply()উত্তরের চেয়ে অনেক বেশি অর্থবোধ করে , তবে, ওপি যেমন চাইছিল তেমন একীভূত করে না।
কিথপজল্লি

যদি আপনার দুটি অবজেক্টের অ্যারে থাকে তবে 'কনক্যাট' ব্যবহার করে আপনি উপরের আউটপুট পেতে পারবেন না। দয়া করে এটি দেখুন jsfiddle.net/jahanzaibaslam/z22n5tuo
জাহানজাইব আসলাম

0

@ ইউআর এর উত্তরের ভিত্তিতে কিন্তু অর্ডারটি রেখেছেন:

var arr3 = [];
for(var i in arr1){
   var shared = false;
   for (var j in arr2)
       if (arr2[j].name == arr1[i].name) {
           arr3.push(arr1[j]
           shared = true;
           break;
       }
   if(!shared) arr3.push(arr1[i])
}

for(var j in arr2){
   var shared = false;
   for (var i in arr1)
       if (arr2[j].name == arr1[i].name) {
           shared = true;
           break;
       }
   if(!shared) arr3.push(arr2[j])
}
arr3

আমি জানি এই সমাধানটি কম দক্ষ, তবে আপনি যদি অর্ডারটি রাখতে চান এবং এখনও অবজেক্টগুলিকে আপডেট করতে চান তবে এটি প্রয়োজনীয়।


0

এখানে একটি jQuery প্লাগইন যা আমি একটি কী দ্বারা দুটি অবজেক্ট অ্যারে মার্জ করার জন্য লিখেছিলাম। মনে রাখবেন যে এটি জায়গায় গন্তব্য অ্যারে পরিবর্তন করে।

(function($) {
  $.extendObjectArray = function(destArray, srcArray, key) {
    for (var index = 0; index < srcArray.length; index++) {
      var srcObject = srcArray[index];
      var existObject = destArray.filter(function(destObj) {
        return destObj[key] === srcObject[key];
      });
      if (existObject.length > 0) {
        var existingIndex = destArray.indexOf(existObject[0]);
        $.extend(true, destArray[existingIndex], srcObject);
      } else {
        destArray.push(srcObject);
      }
    }
    return destArray;
  };
})(jQuery);

var arr1 = [
  { name: "lang",   value: "English" },
  { name: "age",    value: "18"      }
];
var arr2 = [
  { name: "childs", value: '5'       },
  { name: "lang",   value: "German"  }
];
var arr3 = $.extendObjectArray(arr1, arr2, 'name');

console.log(JSON.stringify(arr3, null, 2));
.as-console-wrapper { top: 0; max-height: 100% !important; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


ES6 সংস্করণ

(function($) {
  $.extendObjectArray = (destArr, srcArr, key) => {
    srcArr.forEach(srcObj => (existObj => {
      if (existObj.length) {
        $.extend(true, destArr[destArr.indexOf(existObj[0])], srcObj);
      } else {
        destArr.push(srcObj);
      }
    })(destArr.filter(v => v[key] === srcObj[key])));
    return destArr;
  };
})(jQuery);

0

লড্যাশ ব্যবহার করে আপনি _ ইউনুবি চান

var arr3 = _.uniqBy(arr1.concat(arr2), 'name'); // es5

let arr3 = _.uniqBy([...arr1, ...arr2], 'name'); // es6

অর্ডার 1, এআর 2 বিষয়গুলির অর্ডার!

ডক্স https://lodash.com/docs/4.17.4#uniqBy দেখুন


তৃতীয় পক্ষ ব্যবহার করা প্রয়োজন?
Nguyễn Xuân Hoàng

না এটি এটির অর্জনের সবচেয়ে সংক্ষিপ্ত উপায় এবং এটি কেবল কোনও তৃতীয় পক্ষ নয়, এর লোডাশ!
danday74

0
const extend = function*(ls,xs){
   yield* ls;
   yield* xs;
}

console.log( [...extend([1,2,3],[4,5,6])]  );

2
শুধু প্রশ্নের উত্তর সরবরাহ করবেন না। এই সমাধান কীভাবে সমস্যার সমাধান করে তাও ব্যাখ্যা করুন।
মিত্তাল প্যাটেল

0
merge(a, b, key) {
    let merged = [];
    a.forEach(aitem => {
        let found = b.find( bitem => aitem[key] === bitem[key]);
        merged.push(found? found: aitem);
    });
    return merged;
}

0

আপনি যদি 2 টি অ্যারে মার্জ করতে চান তবে ডুপ্লিকেট অবজেক্টগুলি এটি ব্যবহার করুন। .uniqueIdপ্রতিটি বস্তুর অনুলিপি সনাক্ত করা হয়

function mergeObjectArraysRemovingDuplicates(firstObjectArray, secondObjectArray) {
  return firstObjectArray.concat(
    secondObjectArray.filter((object) => !firstObjectArray.map((x) => x.uniqueId).includes(object.uniqueId)),
  );
}

0

এটা চেষ্টা কর:

var a = [{"a":20, "b":10,"c":"c","d":"asd","f":"any"}]
var b = [{"a":20, "b":10,"c":"c", "e":"nan","g":10200}]

var p = []
_.map(a, function(da){
var chk = _.filter(b, function(ds){
return da.a ===ds.a
})[0]
p.push(_.extend(da, chk))


})

console.log(p)

আউটপুট হবে:

  [{
    "a": 20,
    "b": 10,
    "c": "c",
    "d": "asd",
    "f": "any",
    "e": "nan",
    "g": 10200
  }]

0
const arr1 = ["Vijendra","Singh"];
const arr2 = ["Singh", "Shakya"];

arr2.forEach(item => {
        if(!arr1.find(k => k===item))
          arr1.push(item)
    });


console.log(arr1)

0

জেএস মানচিত্র ব্যবহার করে সমাধান:

const merge = (arr1, arr2, prop) => {
    const resultMap = new Map([...arr1.map((item) => [item[prop], item])]);
    arr2.forEach((item) => {
        const mapItem = resultMap.get(item[prop]);
        if (mapItem) Object.assign(mapItem, item);
        else resultMap.set(item[prop], item);
    });
    return [...resultMap.values()];
};

const arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
const arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});

console.log(merge(arr1, arr2, "name"));

যা উত্পাদন করে:

মার্জ () ফাংশন ফলাফল


0
const array1 = [{id:1,name:'ganza'},
{id:2,name:'respice dddd'},{id:4,name:'respice dddd'},{id:6,name:'respice dddd'},
{id:7,name:'respice dddd'}];
const array2 = [{id:1,name:'ganza respice'},{id:2,name:'respice'},{id:3,name:'mg'}];

 function mergeTwoArray(array1,array2){

    return array1.map((item,i)=>{
        if(array2[i] && item.id===array2[i].id){
          return array2[i];
          }else{
            return item;
          }
    });
  }

const result = merge(array1,array2);
console.log(result);
//here is the result:  Array [Object { id: 1, name: "ganza respice" }, Object { id: 2, name: "respice" }, Object { id: 4, name: "respice dddd" }, Object { id: 6, name: "respice dddd" }, Object { id: 7, name: "respice dddd" }]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.