কীভাবে জাভাস্ক্রিপ্ট এবং ডি-সদৃশ আইটেমগুলিতে দুটি অ্যারে মার্জ করবেন


1364

আমার দুটি জাভাস্ক্রিপ্ট অ্যারে রয়েছে:

var array1 = ["Vijendra","Singh"];
var array2 = ["Singh", "Shakya"];

আমি আউটপুটটি হতে চাই:

var array3 = ["Vijendra","Singh","Shakya"];

আউটপুট অ্যারেতে পুনরাবৃত্তি হওয়া উচিত।

আমি কীভাবে জাভাস্ক্রিপ্টে দুটি অ্যারে একীভূত করব যাতে প্রতিটি অ্যারে থেকে কেবলমাত্র অনন্য আইটেমগুলি একই মূল ক্রমে getোকানো হয়?


1
আপনি একটি নতুন উত্তর পোস্ট করার আগে বিবেচনা করুন ইতিমধ্যে এই প্রশ্নের 75+ উত্তর রয়েছে। দয়া করে নিশ্চিত হন যে আপনার উত্তরটি এমন তথ্যের অবদান রাখে যা বিদ্যমান উত্তরের মধ্যে নেই।
জান্নিকস

[... নতুন সেট ([... [1, 2, 3], ... [2, 3, 4]])]] ফলাফল [1, 2, 3, 4]
ডেনিস গিফেলার

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

উত্তর:


1661

কেবল অ্যারেগুলিকে মার্জ করতে (ডুপ্লিকেট অপসারণ না করে)

ES5 সংস্করণ ব্যবহার Array.concat:

var array1 = ["Vijendra", "Singh"];
var array2 = ["Singh", "Shakya"];

console.log(array1.concat(array2));

ES6 সংস্করণটি ডেস্ট্রাকচারিং ব্যবহার করে

const array1 = ["Vijendra","Singh"];
const array2 = ["Singh", "Shakya"];
const array3 = [...array1, ...array2];

যেহেতু সদৃশ অপসারণের কোনও 'বিল্ট ইন' উপায় নেই ( ইসিএমএ -২2২ আসলে এটির Array.forEachজন্য দুর্দান্ত হবে) তাই আমাদের এটি ম্যানুয়ালি করতে হবে:

Array.prototype.unique = function() {
    var a = this.concat();
    for(var i=0; i<a.length; ++i) {
        for(var j=i+1; j<a.length; ++j) {
            if(a[i] === a[j])
                a.splice(j--, 1);
        }
    }

    return a;
};

তারপরে, এটি ব্যবহার করতে:

var array1 = ["Vijendra","Singh"];
var array2 = ["Singh", "Shakya"];
// Merges both arrays and gets unique items
var array3 = array1.concat(array2).unique(); 

এটি অ্যারের ক্রমও সংরক্ষণ করবে (অর্থাত, কোনও বাছাইয়ের প্রয়োজন নেই)।

যেহেতু অনেকে প্রোটোটাইপ বৃদ্ধি Array.prototypeএবং for inলুপগুলি সম্পর্কে ক্ষুব্ধ , তাই এটি ব্যবহারের জন্য এখানে কম আক্রমণাত্মক উপায় রয়েছে:

function arrayUnique(array) {
    var a = array.concat();
    for(var i=0; i<a.length; ++i) {
        for(var j=i+1; j<a.length; ++j) {
            if(a[i] === a[j])
                a.splice(j--, 1);
        }
    }

    return a;
}

var array1 = ["Vijendra","Singh"];
var array2 = ["Singh", "Shakya"];
    // Merges both arrays and gets unique items
var array3 = arrayUnique(array1.concat(array2));

যারা ES5 উপলব্ধ ব্রাউজারগুলির সাথে কাজ করার যথেষ্ট ভাগ্যবান তাদের জন্য আপনি এটি ব্যবহার করতে পারেন Object.defineProperty:

Object.defineProperty(Array.prototype, 'unique', {
    enumerable: false,
    configurable: false,
    writable: false,
    value: function() {
        var a = this.concat();
        for(var i=0; i<a.length; ++i) {
            for(var j=i+1; j<a.length; ++j) {
                if(a[i] === a[j])
                    a.splice(j--, 1);
            }
        }

        return a;
    }
});

281
মনে রাখবেন যে এই অ্যালগরিদমটি হ'ল (এন ^ 2)।
গম্বো

7
চলুন [a, b, c]এবং [x, b, d]অ্যারে হয়ে থাকুন (উদ্ধৃতিগুলি অনুমান করুন) কনক্যাট দেয় [a, b, c, x, b, d]। অনন্য () এর আউটপুট হবে না [a, c, x, b, d]। এটি আমার মনে হয় এমন অর্ডারটি সংরক্ষণ করে না - আমি বিশ্বাস করি ওপি চায়[a, b, c, x, d]
আমারঘোষ

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

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

16
আপনি সবসময় ব্যবহার করা উচিত for ... inসঙ্গে hasOwnPropertyযে ক্ষেত্রে প্রোটোটাইপ পদ্ধতি জরিমানা
mulllhausen

600

অ্যান্ডস্কোর.জেএস বা লো-ড্যাশের সাহায্যে আপনি এটি করতে পারেন:

console.log(_.union([1, 2, 3], [101, 2, 1, 10], [2, 1]));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

http://underscorejs.org/#union

http://lodash.com/docs#union


70
বা, আন্ডারস্কোরের চেয়ে সম্ভবত আরও ভাল, এপিআই-সামঞ্জস্যপূর্ণ লোড্যাশ
ব্রায়ান এম হান্ট

3
লড্যাশ ডক্স থেকে @Ygg " এক বা একাধিক অ্যারে উপস্থিত থাকে যাতে ক্রমে অদ্বিতীয় মানগুলির একটি নতুন অ্যারে প্রদান করে " "
রিচার্ড আয়ট্ত

4
আমি আন্ডারস্কোর.জেএস পছন্দ করি। আমি underscore.flatten()যেটি ব্যবহার করে শেষ করেছি তা হ'ল এটি ইউনিয়নের চেয়ে ভাল যা এটির অ্যারে নেয়।
তাঁতি 23

8
@ ওয়েভার _.ফ্লেটেন একত্রিত হয়, তবে 'ডি-সদৃশ' হয় না।
গিজসানবি

9
দ্রুত পারফরম্যান্স শীর্ষ উত্তর বনাম লোডাশে গ্রহণ করুন: jsperf.com/
विस-

288

প্রথমে দুটি অ্যারে একত্রীকরণ করুন, পরবর্তীটি কেবল অনন্য আইটেমগুলিই ফিল্টার করুন:

var a = [1, 2, 3], b = [101, 2, 1, 10]
var c = a.concat(b)
var d = c.filter((item, pos) => c.indexOf(item) === pos)

console.log(d) // d is [1, 2, 3, 101, 10]

সম্পাদন করা

প্রস্তাবিত হিসাবে আরও কার্য সম্পাদন ভিত্তিক সমাধান bহ'ল এটির সাথে কথা বলার আগে অনন্য আইটেমগুলি ফিল্টার করা a:

var a = [1, 2, 3], b = [101, 2, 1, 10]
var c = a.concat(b.filter((item) => a.indexOf(item) < 0))

console.log(c) // c is [1, 2, 3, 101, 10]


5
এখানে মূল সমাধানটি প্রতিটি উত্স অ্যারের মধ্যে ডুপগুলি সরিয়ে ফেলার সুবিধা রয়েছে। আমার ধারণা এটি আপনার প্রসঙ্গে যা আপনি ব্যবহার করবেন তার উপর নির্ভর করে।
দ্য গেেকো

আপনি আই 6-সমর্থনের জন্য আলাদা আলাদা করতে পারেন: c = Array.from (নতুন সেট (সি));
টবি জি

আমি যদি যুক্ত করতে আসলে পরিবর্তন aকরতে চাই তবে bলুপটি ব্যবহার করে পুশ ব্যবহার করা কি ভাল? a.forEach(function(item){ if(a.indexOf(item)<0) a.push(item); });
অবাক

1
আইই 6 সম্পর্কে উদ্বিগ্ন লোকদের জন্য কেবল ব্রাউজার ব্যবহারের caniuse.com/usage-table ব্যবহারের কেবলমাত্র একটি অনুস্মারক ।
বিকেল

10
@ অ্যান্ড্রু: আরও উন্নত: 1. var c = [...a, ...b.filter(o => !~a.indexOf(o))]; var c = [...new Set([...a, ...b])];
7vujy0f0hy

203

এটি স্প্রেড অপারেটর এবং অ্যারে জেনেরিকগুলি ব্যবহার করে একটি ইসমাস্ক্রিপ্ট 6 সমাধান ।

বর্তমানে এটি কেবল ফায়ারফক্স এবং সম্ভবত ইন্টারনেট এক্সপ্লোরার প্রযুক্তিগত পূর্বরূপে কাজ করে।

তবে আপনি যদি ব্যাবেল ব্যবহার করেন তবে এখনই তা পেতে পারেন।

const input = [
  [1, 2, 3],
  [101, 2, 1, 10],
  [2, 1]
];
const mergeDedupe = (arr) => {
  return [...new Set([].concat(...arr))];
}

console.log('output', mergeDedupe(input));


14
এটি গ্রহণযোগ্য উত্তরে যুক্ত করা উচিত। এই সমাধানটি বর্তমানে যা সম্ভব তার চেয়ে অনেক বেশি দক্ষ এবং অনেক মার্জিত তবে এটি আমরা অনিবার্যভাবে করতে সক্ষম হব (এবং এই ক্ষেত্রে চালিয়ে যাওয়ার জন্য করা উচিত)।
এমাগামা

এটি ওপি-র প্রশ্নের মতোই নয় (এটি কোনও কিছুর চেয়ে ফ্ল্যাটম্যাপের চেয়ে বেশি বলে মনে হচ্ছে) তবে উজ্জীবিত কারণ এটি দুর্দান্ত।
jedd.ahyoung

4
হার্ড বলতে চাই যে এই গৃহীত উত্তর হওয়া উচিত যেহেতু প্রশ্ন 2009 থেকে তবে হ্যাঁ, এই না শুধুমাত্র "মার্জিত" আরো "performant" বরং
cezar অগাস্টো

11
Array.fromস্প্রেড অপারেটরের পরিবর্তে ব্যবহার করা যেতে পারে: Array.from(new Set([].concat(...arr)))
হেনরি ব্লাইথ

1
এটি খুব মার্জিত। দুর্ভাগ্যক্রমে টাইপসক্রিপ্ট এটি এখনও সমর্থন করে না। stackoverflow.com/questions/33464504/…
বেন কার্প

190

ES6

array1.push(...array2) // => don't remove duplication 

অথবা

[...array1,...array2] //   =>  don't remove duplication 

অথবা

[...new Set([...array1 ,...array2])]; //   => remove duplication

1
১ ম / ২ য় উদাহরণ মোটেও নেই union+ প্রথম উদাহরণটি বড় বড় এসের জন্য স্ট্যাকটি Arrayফুরিয়েছে + তৃতীয় উদাহরণ অবিশ্বাস্যরূপে ধীর এবং প্রচুর স্মৃতি গ্রহণ করে, যেহেতু দুটি মধ্যবর্তী Arrayস্থানে বিল্ডিং করতে হয় + তৃতীয় উদাহরণটি কেবল unionপরিচিত হিসাবে ব্যবহার করা যেতে পারে Arrayসংকলনের সময় এর সংখ্যা ।

তাহলে আপনি এটি কিভাবে করবেন?
ডেভিড নোরিয়া

14
Setএখানে যাওয়ার উপায়
ফিলিপ

3
নোট করুন যে সেটটির জন্য দুটি অবজেক্টের একই কী মান যুক্ত দুটি প্রতিলিপি তৈরি করতে পারবেন না যদি না তারা একই অবজেক্টের রেফারেন্স হয়।
জুন 711

2
কোনও বস্তুর অ্যারের সাথে কাজ করে না, কারণ এটি কেবলমাত্র বস্তুর রেফারেন্সগুলিকে মার্জ করে দেবে এবং বস্তুগুলি নিজেরাই সমান কিনা সেদিকে খেয়াল রাখে না।
উইলসন বিগস 19

87

একটি সেট (ECMAScript 2015) ব্যবহার করে , এটি এতটা সহজ হবে:

const array1 = ["Vijendra", "Singh"];
const array2 = ["Singh", "Shakya"];
console.log(Array.from(new Set(array1.concat(array2))));


7
আমি ES6 ব্যবহারের জন্য এটি "স্বীকৃত উত্তর" বিবেচনা করি।
mwieczorek

9
@ মিওয়াইজোরেক কীভাবে:const array3 = [...new Set(array1.concat(array2))]
রবি কর্নেলিসসেন

5
যদি আপনি কোনও অ্যারে অবজেক্টস ব্যবহার করেন তবে এটি কাজ করে না
কারকড

1
নকল ছাড়াই বিভিন্ন জিনিস মার্জ করার জন্য: stackoverflow.com/a/54134237/3131433
রকিবুল হক

38

এখানে লুপটি কিছুটা আলাদা। Chrome এর সর্বশেষতম সংস্করণে কয়েকটি অপ্টিমাইজেশন সহ, এটি দুটি অ্যারের (ক্রোম 38.0.2111) মিলন সমাধানের জন্য দ্রুততম পদ্ধতি।

http://jsperf.com/merge-two-arrays-keeping-only-unique-values

var array1 = ["Vijendra", "Singh"];
var array2 = ["Singh", "Shakya"];
var array3 = [];

var arr = array1.concat(array2),
  len = arr.length;

while (len--) {
  var itm = arr[len];
  if (array3.indexOf(itm) === -1) {
    array3.unshift(itm);
  }
}

লুপ চলাকালীন: k 589k অপস / এস
ফিল্টার: ~ 445 কে অপস / এস
লোডাশ: লুপগুলির
জন্য 308 কে অপস / এস: 225 কে অপস / এস

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

http://jsperf.com/merge-two-arrays-keeping-only-unique-values/52

let whileLoopAlt = function (array1, array2) {
    const array3 = array1.slice(0);
    let len1 = array1.length;
    let len2 = array2.length;
    const assoc = {};

    while (len1--) {
        assoc[array1[len1]] = null;
    }

    while (len2--) {
        let itm = array2[len2];

        if (assoc[itm] === undefined) { // Eliminate the indexOf call
            array3.push(itm);
            assoc[itm] = null;
        }
    }

    return array3;
};

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

প্রতিটি মান (i-1) এর ডাবল লুপের সাথে এখানে শীর্ষের উত্তরটি এখনও উল্লেখযোগ্যভাবে ধীর। লোডাশ এখনও শক্তিশালী করছে, এবং আমি এখনও তাদের প্রকল্পে একটি লাইব্রেরি যুক্ত করতে কিছু মনে করি না এমন কারও কাছে এটির সুপারিশ করব। যারা চান না তাদের জন্য, আমার লুপটি এখনও একটি ভাল উত্তর এবং ফিল্টার উত্তরটি এখানে খুব শক্তিশালী দেখাচ্ছে যা এই লেখার মতো সর্বশেষ ক্যানারি ক্রোম (৪৪.০.২৩60০) দিয়ে আমার পরীক্ষাগুলিতে হেরে গেছে।

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


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

আমি আপনার ভিত্তিতে @ ডলড্টের সাথে একমত, তবে আপনার ফলাফলগুলির সাথে একমত নই। এন্ট্রিগুলি লুপ ভিত্তিক অপসারণের সাথে একটি মৌলিক নকশার ত্রুটি রয়েছে, এতে আপনি আইটেমগুলি সরিয়ে নেওয়ার পরে অ্যারের দৈর্ঘ্যটি যাচাই করতে হবে, ফলস্বরূপ একটি ধীর সময় কার্যকর হবে। লুপ পিছনে কাজ এই প্রভাব নেই। আমি যতটা সেটআপ ভেরিয়েবলগুলি তাদের মূল উত্তরটি খুব বেশি পরিবর্তন না করেই মুছে ফেলার একটি উদাহরণ এখানে দিয়েছি: jsperf.com/
विस-

লিঙ্কযুক্ত পরীক্ষাগুলি স্লিপস্প্লেড ফাঁকা, এবং jsperf এ পরবর্তী সংশোধনটি যখন লুপটিতে স্থির থাকে।
বোল্ড

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

1
@ স্লিকপ্লেইড বর্ধিত পারফেক্ট পৃষ্ঠা স্থাপনের জন্য ধন্যবাদ। যদি আমি কিছু মিস করছি না, "whileLoopAlt2" ফাংশনটি কাজ করে না? এটি প্রথম অ্যারে এবং দ্বিতীয় অ্যারে (বিপরীত ক্রমে) সহ একটি নতুন অ্যারে তৈরি করে। বিভ্রান্তি এড়াতে আমি আরেকটি সংশোধন করেছি যা ভাঙ্গা ফাংশনটি সরিয়ে দেয়। আমি একটি অতিরিক্ত উদাহরণও জুড়েছি
স্টিফেন এস

37

আপনি এটি ECMAScript 6 দিয়ে সহজভাবে করতে পারেন,

var array1 = ["Vijendra", "Singh"];
var array2 = ["Singh", "Shakya"];
var array3 = [...new Set([...array1 ,...array2])];
console.log(array3); // ["Vijendra", "Singh", "Shakya"];
  • অ্যারে যুক্ত করার জন্য স্প্রেড অপারেটরটি ব্যবহার করুন ।
  • উপাদানগুলির একটি স্বতন্ত্র সেট তৈরি করার জন্য সেট ব্যবহার করুন
  • সেটটিকে অ্যারেতে রূপান্তর করতে আবার স্প্রেড অপারেটরটি ব্যবহার করুন।

2
আমি ত্রুটি পেয়েছি: টাইপ 'সেট <স্ট্রিং>' কোনও অ্যারে টাইপ নয়।
গ্যাটসবিআর

3
আর তুমি কিছু কারণে বিস্তার অপারেটর ব্যবহার করতে না চান, সেখানে আছে: Array.from(new Set(array1.concat(array2)))
কেবিএ

@gattsbr মধ্যে টাইপ করা বিষয় সঙ্গে tsconfig.json, আপনি যোগ করতে পারেন "downlevelIteration": trueথেকে compilerOptions
ভিনসেন্টপেরিন ডট কম

19
Array.prototype.merge = function(/* variable number of arrays */){
    for(var i = 0; i < arguments.length; i++){
        var array = arguments[i];
        for(var j = 0; j < array.length; j++){
            if(this.indexOf(array[j]) === -1) {
                this.push(array[j]);
            }
        }
    }
    return this;
};

একটি আরও ভাল অ্যারে মার্জ ফাংশন।


4
var test = ['a', 'b', 'c']; console.log(test); মুদ্রণ করবে ["a", "b", "c", merge: function]
ডাব্বিডু

দুর্দান্ত সমাধান। আমি @ স্লিকপ্লাইড দ্বারা পোস্ট করা jsperf পরীক্ষাটি আপডেট করেছি ( jsperf.com/mitted-two-arrays-keeping-only-unique-values/3 ) এবং দেখে মনে হচ্ছে এটি তাদের মধ্যে দ্রুততম।
কোবরা 16 ই

@ কোবরা ক্রোম ৪০.০.২২২৪ এ চলমান ক্ষুদ্র ক্ষুদ্র ঝুঁকির ঝুঁকিতে (২/১//১ of হিসাবে সর্বশেষ), এই উত্তরটি আমার চেয়ে 53% ধীর slow OTOH IE11 আমার উত্তরের জন্য মোটেই অনুকূলিত হয়নি বলে মনে হচ্ছে। :) যদিও ক্রোম মোবাইল এখনও এটি দুলছে। সত্য, আপনি যদি আমাদের বেশিরভাগেরই লড্যাশ / _ ব্যবহার করেন তবে সত্যিকারের উত্তরটি ইতিমধ্যে এই তালিকার উপরে। :)
slickplaid

@ স্লিকপ্ল্যাড ট্রু, এবং লড্যাশ / _একটির তুলনায় এটি বেশ খানিকটা দ্রুত। আমি সম্ভবত আমার বাস্তবায়নটি এক পর্যায়ে বা অন্য সময়ে আপনার অনুরূপ কিছুতে পরিবর্তন করতে চলেছি। : ডি
কোবরা

1
সূচিপত্র () পদ্ধতির ব্যয়গুলি কী তা নিশ্চিত নয় তবে এটি সম্ভবত দ্রুততম ইএস 5 সামঞ্জস্যপূর্ণ পদ্ধতি। আর্গুমেন্টগুলির পরিবর্তনশীল দৈর্ঘ্যের প্রয়োজন হয় না এমনও মূল্য নেই। এই পদ্ধতিটি শৃঙ্খলযোগ্য। @ স্লিকপ্লেইড একটি লাইব্রেরি লোড করা কখনই "জাভাস্ক্রিপ্টে এটি কীভাবে করবেন" প্রশ্নের উত্তর নয়। এই 7 লাইনের কাজটি করার জন্য অবশ্যই অনেক লাইব্রেরির একটি ফাংশন রয়েছে।
ডিহর্ট

19

শুধু আমার দুটি সেন্টে ফেলে দিচ্ছি।

function mergeStringArrays(a, b){
    var hash = {};
    var ret = [];

    for(var i=0; i < a.length; i++){
        var e = a[i];
        if (!hash[e]){
            hash[e] = true;
            ret.push(e);
        }
    }

    for(var i=0; i < b.length; i++){
        var e = b[i];
        if (!hash[e]){
            hash[e] = true;
            ret.push(e);
        }
    }

    return ret;
}

এটি এমন একটি পদ্ধতি যা আমি প্রচুর ব্যবহার করি, এটি সদৃশ চেক করার জন্য হ্যাশলুপ আপ টেবিল হিসাবে কোনও বস্তুটি ব্যবহার করে। ধরে নিচ্ছি যে হ্যাশটি ও (1) হয়, তবে এটি ও (এন) এ চলে যেখানে n হল aleleth + b.length। ব্রাউজারটি হ্যাশ কীভাবে করে তা আমার সত্যিই কোনও ধারণা নেই তবে এটি কয়েক হাজার ডেটা পয়েন্টে ভাল সম্পাদন করে।


খুব সুন্দরভাবে সম্পন্ন হয়েছে। এসোসিয়েটিভ অ্যারেটি ব্যবহার করে এবং সূচিপত্র এবং অন্যান্য ক্রিয়াকলাপের লুপিং রেখে এই পৃষ্ঠায় অন্যান্য ফলাফলগুলির বেশিরভাগ (যদি না হয় তবে) খুঁজে বের করে। jsperf.com/
নিম-

আপনার "হ্যাশ" String()জাভাস্ক্রিপ্টে ফাংশন। যা আদিম মানগুলির জন্য কাজ করতে পারে (প্রকারের মধ্যে সংঘর্ষের সাথে হলেও) তবে এটি বস্তুর অ্যারেগুলির জন্য উপযুক্ত নয়।
বার্গি

আমি অনুরূপ সমাধানটি ব্যবহার করি, আমি হ্যাশকোড ফাংশনটি পাস করার জন্য বা স্ট্রিংকে হ্যাশ কী হিসাবে ব্যবহার করার জন্য বস্তুর কোনও সম্পত্তি চিহ্নিত করার অনুমতি দিই।
রবার্ট বেকার

19

নেস্টেড লুপগুলি (O (n ^ 2)) এবং .indexOf()(+ O (n)) কেবল পরিষ্কার করুন।

function merge(a, b) {
    var hash = {}, i;
    for (i=0; i<a.length; i++) {
        hash[a[i]]=true;
    } 
    for (i=0; i<b.length; i++) {
        hash[b[i]]=true;
    } 
    return Object.keys(hash);
}

2
এটি বেশ আশ্চর্যজনক, বিশেষত যদি আপনি স্ট্রিং করছেন। সংখ্যাগুলি এ জাতীয় রাখতে অতিরিক্ত পদক্ষেপের প্রয়োজন হবে। আপনার কাজটি শেষ করার পরে যদি আপনার কিছু মনে না হয় (বা যত্ন নিন) যে সমস্ত কিছু স্ট্রিং is সুন্দর কাজ. পারফরম্যান্সের ফলাফল এখানে: jsperf.com/mitted-two-arrays-keeping-only-unique-values/21
slickplaid

18

এই উত্তরের সর্বাধিক সরলীকৃত এবং এটিকে একটি দুর্দান্ত ফাংশনে পরিণত করেছে:

function mergeUnique(arr1, arr2){
    return arr1.concat(arr2.filter(function (item) {
        return arr1.indexOf(item) === -1;
    }));
}

2
আমি বিশ্বাস করি এটি গৃহীত উত্তরের চেয়ে অনেক পরিষ্কার। এছাড়াও দেখে মনে হচ্ছে ইসটার স্ক্রিপ্ট 5.1 + এ ফিল্টার সমর্থিত যা এখন বেশ সমর্থিত।
টম ফোবার

এটি গ্রহণ করা উচিত ছিল
প্রাচীর op

এটি অনেক বেশি সংহত।
মোক্স

15

আপনি কেন কোনও জিনিস ব্যবহার করবেন না? দেখে মনে হচ্ছে আপনি একটি সেট মডেল করার চেষ্টা করছেন। এটি অবশ্য আদেশ সংরক্ষণ করবে না।

var set1 = {"Vijendra":true, "Singh":true}
var set2 = {"Singh":true,  "Shakya":true}

// Merge second object into first
function merge(set1, set2){
  for (var key in set2){
    if (set2.hasOwnProperty(key))
      set1[key] = set2[key]
  }
  return set1
}

merge(set1, set2)

// Create set from array
function setify(array){
  var result = {}
  for (var item in array){
    if (array.hasOwnProperty(item))
      result[array[item]] = true
  }
  return result
}

মানে না if (!set1.hasOwnProperty(key))?
গম্বো

2
কেন আমি এটা বলতে চাই? এই শর্তটির উদ্দেশ্য হ'ল বৈশিষ্ট্যগুলিকে উপেক্ষা করা যা বস্তুর প্রোটোটাইপে থাকতে পারে।
নিক রেটাল্যাক

12

সবচেয়ে ভালো সমাধান...

আঘাত করে আপনি সরাসরি ব্রাউজার কনসোলে চেক করতে পারেন ...

নকল ছাড়া

a = [1, 2, 3];
b = [3, 2, 1, "prince"];

a.concat(b.filter(function(el) {
    return a.indexOf(el) === -1;
}));

সদৃশ সহ

["prince", "asish", 5].concat(["ravi", 4])

আপনি যদি সদৃশ ছাড়াই চান তবে আপনি এখান থেকে আরও ভাল সমাধানের চেষ্টা করতে পারেন - চিৎকার কোড

[1, 2, 3].concat([3, 2, 1, "prince"].filter(function(el) {
    return [1, 2, 3].indexOf(el) === -1;
}));

ক্রোম ব্রাউজার কনসোল ব্যবহার করে দেখুন

 f12 > console

আউটপুট:

["prince", "asish", 5, "ravi", 4]

[1, 2, 3, "prince"]

এটি আউটপুট অ্যারে থেকে সদৃশ সরিয়ে দেয় না।
শাহর

9

আমার দেড় টাকা

Array.prototype.concat_n_dedupe = function(other_array) {
  return this
    .concat(other_array) // add second
    .reduce(function(uniques, item) { // dedupe all
      if (uniques.indexOf(item) == -1) {
        uniques.push(item);
      }
      return uniques;
    }, []);
};

var array1 = ["Vijendra","Singh"];
var array2 = ["Singh", "Shakya"];

var result = array1.concat_n_dedupe(array2);

console.log(result);

এটি ES6 তে নতুন কিছু ব্যবহার করে না, আমি কি কিছু মিস করেছি?
বার্গি

@ বার্গি: হ্যাঁ, আপনি ঠিক বলেছেন। লক্ষ করার জন্য আপনাকে ধন্যবাদ। একরকম আমি এই স্ক্রিপ্টটি নিয়ে খেলছিলাম এবং সম্ভবত ES6 ফাংশনটির সাথে কিছু সংস্করণ ছিল, তবে এখন এটিতে সূচিপত্র রয়েছে যা সেঞ্চুরির পরে রয়েছে। আমার ভুল, দুঃখিত।
হিরো Qu

8

অ্যান্ডসকোর.জেএস এর => ইউনিক ব্যবহার করে আপনি এটি অর্জন করতে পারেন :

array3 = _.uniq(array1.concat(array2))

console.log(array3)

এটি ["বিজেন্দ্র", "সিং", "শাক্য"] মুদ্রণ করবে ।


7

ES6 এর জন্য, কেবল একটি লাইন:

a = [1, 2, 3, 4]
b = [4, 5]
[...new Set(a.concat(b))]  // [1, 2, 3, 4, 5]

7

আমি জানি এই প্রশ্নটি বস্তুর অ্যারে সম্পর্কে নয়, তবে অনুসন্ধানকারীরা এখানেই শেষ করবেন।

সুতরাং ভবিষ্যতের পাঠকদের জন্য মার্জ করার একটি উপযুক্ত ES6 উপায় এবং তারপরে ডুপ্লিকেটগুলি সরিয়ে ফেলার উপযুক্ত

বস্তুর অ্যারে :

var arr1 = [ {a: 1}, {a: 2}, {a: 3} ];
var arr2 = [ {a: 1}, {a: 2}, {a: 4} ];

var arr3 = arr1.concat(arr2.filter( ({a}) => !arr1.find(f => f.a == a) ));

// [ {a: 1}, {a: 2}, {a: 3}, {a: 4} ]

6
//Array.indexOf was introduced in javascript 1.6 (ECMA-262) 
//We need to implement it explicitly for other browsers, 
if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt, from)
  {
    var len = this.length >>> 0;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}
//now, on to the problem

var array1 = ["Vijendra","Singh"];
var array2 = ["Singh", "Shakya"];

var merged = array1.concat(array2);
var t;
for(i = 0; i < merged.length; i++)
  if((t = merged.indexOf(i + 1, merged[i])) != -1)
  {
    merged.splice(t, 1);
    i--;//in case of multiple occurrences
  }

indexOfঅন্যান্য ব্রাউজারগুলির জন্য পদ্ধতির বাস্তবায়ন এমডিসি থেকে নেওয়া হয়


1
আমি ডাব্লু 3 স্কুলগুলিতে এটি খুঁজে পাইনি, এ কারণেই আমি এটি লিখেছিলাম। w3schools.com/jsref/jsref_obj_array.asp এটি কি fromপ্যারামিটার বিটিডব্লু নেয়?
আমারঘোষ

ধন্যবাদ @ গম্বো এবং @ মিডার - এখন আমার বুকমার্কগুলিকে পরিবর্তন করবে। আমি জেএস-এ এখনও সিরিয়াস কিছু করতে পারছি না এবং আমি নৈমিত্তিক রেফারেন্সের জন্য ডাব্লু 3 স্কুল ব্যবহার করি (এটাই আমার যা প্রয়োজন সবসময়ই) - সে কারণেই আমি বুঝতে পারি নি।
অমরঘোষ

এমডিসি জানিয়েছে যে সূচিপত্রের জন্য জাভাস্ক্রিপ্ট ১. requires প্রয়োজন, সাধারণ ব্রাউজারগুলি (> = এফএফ 2,> আই etc ইত্যাদি) এটি সমর্থন করবে কিনা তা নিরাপদ হবে?
অমরঘোষ

4
আই 66 অ্যারে.প্রোটোটাইপ.আইডিএক্স সমর্থন করে না, মজিলার দেওয়া সমর্থন পদ্ধতিটি কেবল পেস্ট করুন যাতে আইই কোনও ত্রুটি না ফেলে।
মধ্যস্থতাকারী ওমুরালিভ

ব্যবহার করে আপডেট indexOf। মন্তব্য করা অংশটি সরিয়ে কোড পরিষ্কার করেছেন। @ মিডার - আবার ধন্যবাদ।
অমরঘোষ

6

নতুন সমাধান (যা ব্যবহার করে Array.prototype.indexOfএবং Array.prototype.concat):

Array.prototype.uniqueMerge = function( a ) {
    for ( var nonDuplicates = [], i = 0, l = a.length; i<l; ++i ) {
        if ( this.indexOf( a[i] ) === -1 ) {
            nonDuplicates.push( a[i] );
        }
    }
    return this.concat( nonDuplicates )
};

ব্যবহার:

>>> ['Vijendra', 'Singh'].uniqueMerge(['Singh', 'Shakya'])
["Vijendra", "Singh", "Shakya"]

অ্যারে.প্রোটোটাইপ.ইন্ডেক্সঅফ (ইন্টারনেট এক্সপ্লোরারের জন্য):

Array.prototype.indexOf = Array.prototype.indexOf || function(elt)
  {
    var len = this.length >>> 0;

    var from = Number(arguments[1]) || 0;
    from = (from < 0) ? Math.ceil(from): Math.floor(from); 
    if (from < 0)from += len;

    for (; from < len; from++)
    {
      if (from in this && this[from] === elt)return from;
    }
    return -1;
  };

@ মেন্ডার: যদি আদেশের বিষয়টি না হয় তবে আমি এটি কীভাবে করব
বিজજેন্দ্র

1
এটি অ্যারে.প্রোটোটাইপের জন্য সংজ্ঞায়িত কোনও স্ট্যান্ডার্ড ECMAScript পদ্ধতি নয়, যদিও আমি সচেতন আপনি এটি সহজেই IE এবং অন্যান্য ব্রাউজারগুলির জন্য এটি সংজ্ঞা দিতে পারেন যা এটি সমর্থন করে না।
মধ্যস্বত্বভোগী ওমুরিলিভ

মনে রাখবেন যে এই অ্যালগরিদমটি হ'ল (এন ^ 2)।
গম্বো

আপনার উত্তর কি অ্যালগরিদম?
মধ্যস্বত্বভোগী ওমরালিভিভ

@ মিডার: আমার অ্যালগরিদম একটি ইউনিয়ন অ্যালগরিদম। ইউনিয়নটি নিজেই ও (এন + এম) এ সম্পন্ন হয় তবে স্রোটিংয়ে বেশিরভাগ ও (এন · লগ এন + এম · লগ এম) লাগে। সুতরাং পুরো অ্যালগরিদম হল ও (n · লগ এন + এম · লগ এম)।
গম্বো

6

এটি সেট ব্যবহার করে করা যেতে পারে।

var array1 = ["Vijendra","Singh"];
var array2 = ["Singh", "Shakya"];

var array3 = array1.concat(array2);
var tempSet = new Set(array3);
array3 = Array.from(tempSet);

//show output
document.body.querySelector("div").innerHTML = JSON.stringify(array3);
<div style="width:100%;height:4rem;line-height:4rem;background-color:steelblue;color:#DDD;text-align:center;font-family:Calibri" > 
  temp text 
</div>


6

দুটি অ্যারে মার্জ করার জন্য অনেকগুলি সমাধান রয়েছে। এগুলিকে দুটি প্রধান বিভাগে ভাগ করা যায় (তৃতীয় পক্ষের লাইব্রেরি যেমন লোডাশ বা আন্ডারস্কোর.জেএস ব্যবহার ব্যতীত)।

ক) দুটি অ্যারে একত্রিত করুন এবং নকল আইটেমগুলি সরান।

খ) আইটেমগুলিকে একত্রিত করার আগে ফিল্টার আউট করুন।

দুটি অ্যারে একত্রিত করুন এবং নকল আইটেমগুলি সরান

মিশ্রন

// mutable operation(array1 is the combined array)
array1.push(...array2);
array1.unshift(...array2);

// immutable operation
const combined = array1.concat(array2);
const combined = [...array1, ...array2];    // ES6

unifying

অ্যারে একীকরণের অনেকগুলি উপায় রয়েছে, আমি ব্যক্তিগতভাবে দুটি পদ্ধতির নীচে পরামর্শ দিই।

// a little bit tricky
const merged = combined.filter((item, index) => combined.indexOf(item) === index);
const merged = [...new Set(combined)];

আইটেমগুলিকে একত্রিত করার আগে ফিল্টার আউট করুন

এছাড়াও অনেকগুলি উপায় রয়েছে তবে আমি নীচের কোডটির সরলতার কারণে ব্যক্তিগতভাবে পরামর্শ দিই।

const merged = array1.concat(array2.filter(secItem => !array1.includes(secItem)));

5
Array.prototype.add = function(b){
    var a = this.concat();                // clone current object
    if(!b.push || !b.length) return a;    // if b is not an array, or empty, then return a unchanged
    if(!a.length) return b.concat();      // if original is empty, return b

    // go through all the elements of b
    for(var i = 0; i < b.length; i++){
        // if b's value is not in a, then add it
        if(a.indexOf(b[i]) == -1) a.push(b[i]);
    }
    return a;
}

// Example:
console.log([1,2,3].add([3, 4, 5])); // will output [1, 2, 3, 4, 5]

5
array1.concat(array2).filter((value, pos, arr)=>arr.indexOf(value)===pos)

এটির সম্পর্কে দুর্দান্ত জিনিসটি হল পারফরম্যান্স এবং আপনি সাধারণভাবে অ্যারেগুলির সাথে কাজ করার সময় ফিল্টার, মানচিত্র ইত্যাদির মতো পদ্ধতিগুলি শৃঙ্খলাবদ্ধ করে রাখেন যাতে আপনি সেই লাইনটি যুক্ত করতে পারেন এবং এটির পরে একটি রেফারেন্সের প্রয়োজন ছাড়াই বিন্যাস এবং অ্যারে 1 দিয়ে অ্যারে 2 কে নকল করবে will একটি (যখন আপনি পদ্ধতিগুলি শৃঙ্খলিত করছেন যখন আপনার নেই) উদাহরণস্বরূপ:

someSource()
.reduce(...)
.filter(...)
.map(...) 
// and now you want to concat array2 and deduplicate:
.concat(array2).filter((value, pos, arr)=>arr.indexOf(value)===pos)
// and keep chaining stuff
.map(...)
.find(...)
// etc

(আমি অ্যারে.প্রোটোটাইপকে দূষিত করতে পছন্দ করি না এবং এটি শৃঙ্খলার সম্মানের একমাত্র উপায় - একটি নতুন ফাংশন সংজ্ঞায়িত করা এটি ভেঙে ফেলবে - তাই আমি মনে করি এরকম কিছু সম্পাদন করার একমাত্র উপায় এটি)



3

ES2015 সহ একটি কার্যকরী পদ্ধতির

ক্রিয়ামূলক পদ্ধতির একটি অনুসরণ unionদুই Arrayগুলি শুধু রচনা নয় concatএবং filter। অনুকূল কর্মক্ষমতা সরবরাহের জন্য আমরা দেশীয় Setডেটা টাইপটিকে অবলম্বন করি যা সম্পত্তি অনুসন্ধানের জন্য অনুকূলিত।

যাইহোক, কোনও unionফাংশনের সাথে একত্রে মূল প্রশ্নটি হ'ল নকলগুলি কীভাবে আচরণ করা যায়। নিম্নলিখিত ক্রিয়াকলাপগুলি সম্ভব:

Array A      + Array B

[unique]     + [unique]
[duplicated] + [unique]
[unique]     + [duplicated]
[duplicated] + [duplicated]

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


// small, reusable auxiliary functions

const comp = f => g => x => f(g(x));
const apply = f => a => f(a);
const flip = f => b => a => f(a) (b);
const concat = xs => y => xs.concat(y);
const afrom = apply(Array.from);
const createSet = xs => new Set(xs);
const filter = f => xs => xs.filter(apply(f));


// de-duplication

const dedupe = comp(afrom) (createSet);


// the actual union function

const union = xs => ys => {
  const zs = createSet(xs);  
  return concat(xs) (
    filter(x => zs.has(x)
     ? false
     : zs.add(x)
  ) (ys));
}


// mock data

const xs = [1,2,2,3,4,5];
const ys = [0,1,2,3,3,4,5,6,6];


// here we go

console.log( "unique/unique", union(dedupe(xs)) (ys) );
console.log( "duplicated/unique", union(xs) (ys) );

এখান থেকে এটি কোনও unionnক্রিয়াকলাপ বাস্তবায়নের জন্য তুচ্ছ হয়ে ওঠে, যা কোনও সংখ্যক অ্যারে গ্রহণ করে (নাওমিকের মন্তব্যে অনুপ্রাণিত):

// small, reusable auxiliary functions

const uncurry = f => (a, b) => f(a) (b);
const foldl = f => acc => xs => xs.reduce(uncurry(f), acc);

const apply = f => a => f(a);
const flip = f => b => a => f(a) (b);
const concat = xs => y => xs.concat(y);
const createSet = xs => new Set(xs);
const filter = f => xs => xs.filter(apply(f));


// union and unionn

const union = xs => ys => {
  const zs = createSet(xs);  
  return concat(xs) (
    filter(x => zs.has(x)
     ? false
     : zs.add(x)
  ) (ys));
}

const unionn = (head, ...tail) => foldl(union) (head) (tail);


// mock data

const xs = [1,2,2,3,4,5];
const ys = [0,1,2,3,3,4,5,6,6];
const zs = [0,1,2,3,4,5,6,7,8,9];


// here we go

console.log( unionn(xs, ys, zs) );

দেখা যাচ্ছে unionnযে ঠিক foldl(ওরফে Array.prototype.reduce), যা unionএটির রিডিউসার হিসাবে গ্রহণ করে। দ্রষ্টব্য: যেহেতু বাস্তবায়ন কোনও অতিরিক্ত সংযোজক ব্যবহার করে না, আপনি যুক্তি ছাড়াই এটি প্রয়োগ করার সময় এটি একটি ত্রুটি ফেলে দেবে।


1
একটি দম্পতি প্রতিক্রিয়া: আমি লক্ষ্য করেছি flipএবং notfঅব্যবহৃত are এছাড়াও unionByসম্পৃক্ত তথ্য ফাঁসের বাস্তবায়ন বিবরণ (অন্তর্নিহিত জ্ঞান প্রয়োজন Setটাইপ)। আপনি ঠিক এইরকম কিছু করতে পারলে এটি চমৎকার হতে পারে: union = unionBy (apply)এবং unionci = unionBy (p => x => p(x.toLowerCase()))। এইভাবে ব্যবহারকারী কেবলমাত্র গ্রুপিংয়ের মান যা যা পাঠায় p- কেবল একটি ধারণা ^ _ ^
আপনাকে ধন্যবাদ

zsভেরিয়েবল ঘোষণায় var/ letকীওয়ার্ডেরও অভাব রয়েছে
আপনাকে ধন্যবাদ

1
স্পষ্ট করার জন্য এখানে একটি কোড স্নিপেট রয়েছে [সংক্ষিপ্ত: ইউনিয়নবাই.জেএস ]
আপনাকে ধন্যবাদ

@ নোমিক কিছুক্ষণের জন্য আমার সমাধানটি পুনর্বিবেচনা করার পরে আমি এতটা নিশ্চিত নই যে এটি যদি ভবিষ্যদ্বাণীটি পাস করার সঠিক উপায় হয়। আপনি যা অর্জন করেছেন তা হ'ল দ্বিতীয় অ্যারের প্রতিটি উপাদানের রূপান্তর। আমি ভাবছি যদি এই পদ্ধতিটি খেলনা সমস্যার চেয়ে আরও বেশি সমাধান করে।

3

এটির জন্য ... এখানে একটি একক লাইন সমাধান:

const x = [...new Set([['C', 'B'],['B', 'A']].reduce( (a, e) => a.concat(e), []))].sort()
// ['A', 'B', 'C']

বিশেষভাবে পাঠযোগ্য নয় তবে এটি কারওর পক্ষে সহায়তা করতে পারে:

  1. খালি অ্যারেতে সেট করা প্রাথমিক সঞ্চয়ের মান সহ একটি হ্রাস ফাংশন প্রয়োগ করে।
  2. হ্রাস ফাংশন প্রতিটি উপ-অ্যারেটি সংযোজকের অ্যারেতে যুক্ত করতে কনক্যাট ব্যবহার করে।
  3. এর ফলাফলটি একটি নতুন তৈরির জন্য কনস্ট্রাক্টর প্যারামিটার হিসাবে পাস করা হয়েছে Set
  4. এটিকে Setঅ্যারেতে রূপান্তর করতে স্প্রেড অপারেটর ব্যবহার করা হয় ।
  5. sort()ফাংশন নতুন অ্যারে প্রয়োগ করা হয়।

2
এছাড়াও এর পরিবর্তে reduce()আপনি ব্যবহার করতে পারেনArray.from(set)
ইরান গোল্ডিন

3

একক বা মার্জ করুন এবং একাধিক অ্যারে ইনপুটগুলি নকল করুন D নীচে উদাহরণ।

ES6 ব্যবহার - ধ্বংস, জন্য, সেট করুন

আমি এই সাধারণ ফাংশনটি লিখেছি যা একাধিক অ্যারে আর্গুমেন্ট গ্রহণ করে। উপরের সমাধানটির মতো প্রায় একইরকম আরও ব্যবহারিক ব্যবহারের ক্ষেত্রে রয়েছে। এই ফাংশনটি কেবলমাত্র একটি অ্যারেতে সদৃশ মানগুলিকে সুস্পষ্ট করে না যাতে এটি পরে কোনও পর্যায়ে সেগুলি মুছতে পারে।

সংক্ষিপ্ত ফাংশন সংজ্ঞা (মাত্র 9 লাইন)

/**
* This function merging only arrays unique values. It does not merges arrays in to array with duplicate values at any stage.
*
* @params ...args Function accept multiple array input (merges them to single array with no duplicates)
* it also can be used to filter duplicates in single array
*/
function arrayDeDuplicate(...args){
   let set = new Set(); // init Set object (available as of ES6)
   for(let arr of args){ // for of loops through values
      arr.map((value) => { // map adds each value to Set object
         set.add(value); // set.add method adds only unique values
      });
   }
   return [...set]; // destructuring set object back to array object
   // alternativly we culd use:  return Array.from(set);
}

উদাহরণস্বরূপ কোড ব্যবহার করুন :

// SCENARIO 
let a = [1,2,3,4,5,6];
let b = [4,5,6,7,8,9,10,10,10];
let c = [43,23,1,2,3];
let d = ['a','b','c','d'];
let e = ['b','c','d','e'];

// USEAGE
let uniqueArrayAll = arrayDeDuplicate(a, b, c, d, e);
let uniqueArraySingle = arrayDeDuplicate(b);

// OUTPUT
console.log(uniqueArrayAll); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 43, 23, "a", "b", "c", "d", "e"]
console.log(uniqueArraySingle); // [4, 5, 6, 7, 8, 9, 10]

কেন arr.mapএখানে ব্যবহার ? আপনি এটিকে একটি হিসাবে ব্যবহার করছেন foreach, ফলাফলটি উপেক্ষা করার সাথে সাথে
অ্যান্টনি

আমি রিটার্ন অ্যারে.ফর্ম (সেট.ভেলিউস ()) ব্যবহার করেছি; , কারণ vscode ফেরতের জন্য ত্রুটি দেয় [... সেট];
মাকাকাশি


3

var array1 = ["one","two"];
var array2 = ["two", "three"];
var collectionOfTwoArrays = [...array1, ...array2];    
var uniqueList = array => [...new Set(array)];
console.log('Collection :');
console.log(collectionOfTwoArrays);    
console.log('Collection without duplicates :');
console.log(uniqueList(collectionOfTwoArrays));

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