অ্যারে তুলনা করতে লোটাস ব্যবহার করা (আইটেম অর্ডার ছাড়াই অস্তিত্ব)


124

আমি জানি আমি লুপগুলি ব্যবহার করে এটি করতে পারি, তবে আমি এটি করার একটি দুর্দান্ত উপায় সন্ধান করার চেষ্টা করছি:

আমার দুটি অ্যারে রয়েছে:

var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];

lodashউপরের দুটি অ্যারে একইরূপে রয়েছে তা নিশ্চিত করতে আমি ব্যবহার করতে চাই । দ্বারা 'একই' আমি বলতে চাচ্ছি কোনও আইটেম নেই array1যে অন্তর্ভুক্ত করা হয় না array2

এই আইটেমগুলির মধ্যে সমতা পরীক্ষা করার ক্ষেত্রে:

['a', 'b'] == ['b', 'a'] 

অথবা

['a', 'b'] == ['a', 'b'] 

অক্ষরগুলি সর্বদা যথাযথ থাকায় উভয়ই কাজ করে।

উত্তর:


224

আপনি যদি বাইরের অ্যারে বাছাই করেন _.isEqual()তবে অভ্যন্তরীণ অ্যারেটি ইতিমধ্যে বাছাই করা থেকে আপনি ব্যবহার করতে পারেন ।

var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];
_.isEqual(array1.sort(), array2.sort()); //true

নোট যে .sort()অ্যারে পরিবর্তন করতে হবে। আপনার যদি সমস্যা হয় তবে প্রথমে একটি অনুলিপি তৈরি করুন (উদাহরণস্বরূপ) .slice()বা স্প্রেড অপারেটর ( ...)।

বা, নীচে একটি মন্তব্যে ড্যানিয়েল বুডিকের পরামর্শ অনুযায়ী করুন:

_.isEqual(_.sortBy(array1), _.sortBy(array2))

লোডাশ sortBy()অ্যারেটি পরিবর্তন করবে না।


6
অ্যাকাউন্টে বিবেচনা করুন যে অ্যারে.সোর্ট () মূল অ্যারেটিকে পরিবর্তন করছে। হতে পারে এটি আরও ভাল হতে পারে: var অ্যারে 1 = [['a', 'বি'], ['বি', 'সি']]; var অ্যারে 2 = [['বি', 'সি'], ['এ', 'বি']]; _.isEqual ([... অ্যারে 1]। সাজান (), [... অ্যারে 2] .সোর্ট ()); // সত্য
ইয়ানিভ ইফ্রয়িম

3
দুটি বাক্য যুক্ত করা হয়েছে যা উল্লেখ করে যে .sort()রূপান্তরিত হয় এবং প্রথমে অনুলিপি করার বিকল্পগুলির পরামর্শ দেওয়া হয় যদি এটি ব্যবহারকারীর জন্য সমস্যা হয়।
ট্রট

6
আপনি যদি ইতিমধ্যে লোডাশ ব্যবহার করছেন তবে আপনি কেবল _.isEqual(_.sortBy(array1), _sortBy(array2))রূপান্তর রোধ করতে পারেন।
ড্যানিয়েল বুডিক

1
@ ড্যানিয়েল বুডিক ধন্যবাদ! আমি উত্তরে এটি যোগ করেছি। দুর্দান্ত পরামর্শ।
ট্রট

31

আপনি lodashs ব্যবহার করতে পারেন xorএই জন্য

doArraysContainSameElements = _.xor(arr1, arr2).length === 0

আপনি যদি অ্যারে [1, 1] কে অ্যারে [1] এর চেয়ে আলাদা বলে মনে করেন তবে আপনি কিছুটা পারফরম্যান্সের উন্নতি করতে পারেন:

doArraysContainSameElements = arr1.length === arr2.length === 0 && _.xor(arr1, arr2).length === 0

1
অ্যারেগুলি যেভাবেই বাছাই করা দরকার।
সোভাথা সোক

1
এটি নতুন সংস্করণের জন্য আরও ভাল উপায় হওয়া উচিত
লিওনার্দো

@ সোভট্ট সোক অ্যারে বাছাই করার দরকার নেই। করা _.xor([3,4], [4,3]).length == 0আপনার সত্য হবে।
নিকোলে

1
সাবধানতার একটি শব্দ: এই কৌশলটি "ছোট" অ্যারেগুলির জন্য ভাল কাজ করে তবে এটির ব্যথা পারফরম্যান্স এবং স্মৃতি অনুসারে হতে পারে যদি আপনার অ্যারেগুলি বিশাল হয় এবং বেশিরভাগই আলাদা হন কারণ _.xor () প্রথম পার্থক্যটি ছাড়িয়ে যাবে। অন্য কথায় এটি সনাক্ত করা প্রথম পার্থক্যে দ্রুত ফিরে আসে না।
এক্সডিএস

6

'একই' দ্বারা আমি বোঝাতে চাইছি যে অ্যারে 1 তে কোনও আইটেম নেই যা অ্যারে 2 তে নেই।

আপনি () এবং পার্থক্য () এই জন্য, যা ভাল কাজ করে চেপ্টা ব্যবহার করেন যদি আপনি সেখানে আইটেম নেই পরোয়া করি না পারে array2যে নয় মধ্যে array1। দেখে মনে হচ্ছে আপনি অ্যারে 1 এর অ্যারে 2 এর একটি উপসেট ?

var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];

function isSubset(source, target) {
    return !_.difference(_.flatten(source), _.flatten(target)).length;
}

isSubset(array1, array2); // → true
array1.push('d');
isSubset(array1, array2); // → false
isSubset(array2, array1); // → true

4

এখানে ইতিমধ্যে উত্তর রয়েছে, তবে এখানে আমার খাঁটি জেএস বাস্তবায়ন। আমি এটি সর্বোত্তম কিনা তা নিশ্চিত নই তবে এটি অবশ্যই স্বচ্ছ, পাঠযোগ্য এবং সহজ।

// Does array a contain elements of array b?
const contains = (a, b) => new Set([...a, ...b]).size === a.length
const isEqualSet = (a, b) => contains(a, b) && contains(b, a)

মূলত যুক্তিটি contains()হ'ল যদি aএর মধ্যে সমস্ত উপাদান থাকে bতবে সেগুলি একই সেটে রাখলে আকার পরিবর্তন হবে না।

উদাহরণস্বরূপ, যদি const a = [1,2,3,4]এবং const b = [1,2]তারপর new Set([...a, ...b]) === {1,2,3,4}। আপনি দেখতে পাচ্ছেন, ফলস্বরূপ সেটে একই উপাদান রয়েছে a

সেখান থেকে, এটি আরও সংক্ষিপ্ত করতে, আমরা এটিকে নীচে সিদ্ধ করতে পারি:

const isEqualSet = (a, b) => {
  const unionSize = new Set([...a, ...b])
  return unionSize === a.length && unionSize === b.length
}

1

খাঁটি জেএস (যখন অ্যারে এবং সাবারিতে স্বেচ্ছাসেবীর সাথে 2 টিরও বেশি উপাদান থাকে) এছাড়াও কাজ করে। স্ট্রিংগুলিতে প্যারামিটার অক্ষর (ইউটিফ হতে পারে) ,হিসাবে ব্যবহার থাকে join('-')যা স্ট্রিংগুলিতে ব্যবহৃত হয় না

array1.map(x=>x.sort()).sort().join() === array2.map(x=>x.sort()).sort().join()


0

আমরা _.differenceকোনও পার্থক্য আছে কি না তা দেখতে ফাংশনটি ব্যবহার করতে পারি ।

function isSame(arrayOne, arrayTwo) {
   var a = _.unique(arrayOne),
       b = _.unique(arrayTwo);

   if (a.length <= b.length) {
      a = arrayTwo;
      b = arrayOne;
      return _.isEmpty(_.difference(a.sort(), b.sort()));
   } else {
      return false;
   }

}

// examples
console.log(isSame([1, 2, 3], [1, 2, 3])); // true
console.log(isSame([1, 2, 4], [1, 2, 3])); // false
console.log(isSame([1, 2], [2, 3, 1])); // false
console.log(isSame([2, 3, 1], [1, 2])); // false

// Test cases pointed by Mariano Desanze, Thanks.
console.log(isSame([1, 2, 3], [1, 2, 2])); // false
console.log(isSame([1, 2, 2], [1, 2, 2])); // true
console.log(isSame([1, 2, 2], [1, 2, 3])); // false

আমি আশা করি এটা তোমাকে সাহায্য করবে।


5
ভুল, আপনার ফাংশন পাবেন trueজন্যconsole.log(isSame([1,2], [2,3,1]));
ডেভিড লিন

3
এটি জানাতে আপনাকে ডেভিডলিনকে ধন্যবাদ। আমি এই কেসটি বিবেচনা করার জন্য পরিবর্তন করেছি। ধন্যবাদ এবং অসুবিধার জন্য দুঃখিত।
অমিতেশ

2
দৈর্ঘ্য এক রকম না হলে আপনাকে কোনও & বি এর জন্য স্থানগুলি স্যুইচ করার দরকার নেই। যদি দৈর্ঘ্য পৃথক হয় তবে তারা ইতিমধ্যে একই হতে পারে না, তাই যদি (অ্যারেওনে.লেঙ্গ! == অ্যারেটিও.লেংহেট) মিথ্যা ফিরে আসে;
অ্যালেক্স

1
-1 সেগুলি aএবং bভেরিয়েবলগুলি রাখার কোনও অর্থ নেই । আপনি শুধুমাত্র ভিতরে যারা ভেরিয়েবল ব্যবহার if-thenঅংশ, এবং প্রথম জিনিস আপনি কি করতে সেখানে যারা মান লোড লাইন 2 এ আমি মনে করি নিম্নলিখিত একক লাইন ঠিক একই কাজ করবে বাতিল হয়: return arrayOne.length <= arrayTwo.length && _.isEmpty(_.difference(arrayTwo.sort(), arrayTwo.sort());। এবং এর <=মধ্যেও উন্নতি করা যায় ===
মারিয়ানো দেশানজে

1
এবং _.difference1 ম আর্গুমেন্টের অনুপস্থিত আইটেমগুলি ফিরিয়ে দেবে, তবে ২ য় প্রতিবেদনে আইটেম নেই। এই তাই ভুল ফিরে আসবে trueযখন আপনি 2nd 1 ম আইটেম পুনরাবৃত্তি: isSame([1, 2, 3], [1, 2, 2])
মারিয়ানো দেশানজে

0

সম্পাদনা: আমি এই প্রশ্নের বহুমাত্রিক দিকটি মিস করেছি, সুতরাং এটি যদি এখানে লোককে এক-মাত্রিক অ্যারে তুলনা করতে সহায়তা করে তবে আমি এটি এখানে রেখে যাচ্ছি

এটি একটি পুরানো প্রশ্ন, তবে আমি ব্যবহারের গতি .sort()বা sortBy()আমার সমস্যা ছিল , তাই আমি পরিবর্তে এটি ব্যবহার করেছি:

function arraysContainSameStrings(array1: string[], array2: string[]): boolean {
  return (
    array1.length === array2.length &&
    array1.every((str) => array2.includes(str)) &&
    array2.every((str) => array1.includes(str))
  )
}

এটি দ্রুত ব্যর্থ করার উদ্দেশ্যে করা হয়েছিল, এবং আমার উদ্দেশ্যগুলির জন্য ভাল কাজ করে।


শেষ চেক কি সত্যিই প্রয়োজনীয়? array1.every((str) => array2.includes(str))যথেষ্ট হতে হবে। এছাড়াও ওপি লোডাশ ব্যবহার করতে চেয়েছিল, কমপক্ষে আপনি কেন ভ্যানিলাজেএস সমাধান প্রস্তাব করবেন তা বলা উচিত (... এখন আমাদের কাছে সমস্ত রয়েছে এবং এর মধ্যে রয়েছে ...)। দয়া করে প্রদত্ত সমস্যায় কীভাবে আপনার ফাংশনটি প্রয়োগ করতে হবে (দ্বিমাত্রিক অ্যারে) তার একটি উদাহরণ দিন।
লাইন-

এটি একটি ভাল পয়েন্ট - আমি এর বহুমাত্রিক দিকটি সম্বোধন করিনি, লোডাশের প্রয়োজন নেই। আমি ভেবেছিলাম যে lodash methods to compare arrays without considering orderআধুনিক জাভাস্ক্রিপ্টে কোনও বিকল্প দেখার জন্য যে কেউ অনুসন্ধান করবে (যেমনটি আমি করেছি) তা কার্যকর হবে । দ্বিতীয় চেকটি প্রয়োজনীয় যেমনটি arraysContainSameStrings(['1', '2', '2'], ['1', '2', '3'])অন্যথায় সত্য হয়। আমি এটি এখানে রেখে দেব, কারণ এটি সাহায্য করতে পারে, তবে আমি প্রশংসা করব আমি প্রশ্নের উত্তর না দিয়েছি
চার্লিমেটারস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.