জাভাস্ক্রিপ্টে, আমি কীভাবে চেক করব যে কোনও অ্যারের সদৃশ মান রয়েছে কিনা?


95

সম্ভাব্য সদৃশ:
জাভাস্ক্রিপ্ট অ্যারেতে সদৃশ মানগুলি খুঁজে পাওয়ার সহজতম উপায়

অ্যারেতে সদৃশ মান রয়েছে কিনা তা আমি কীভাবে পরীক্ষা করব?

অ্যারের কিছু উপাদান যদি একই হয় তবে সত্যটি ফিরে আসুন। অন্যথায়, মিথ্যা ফিরে।

['hello','goodbye','hey'] //return false because no duplicates exist
['hello','goodbye','hello'] // return true because duplicates exist

বিজ্ঞপ্তি আমি সদৃশ সন্ধানের জন্য যত্নবান নই, কেবল ব্রেইন ফলাফল চাই যা অ্যারেতে সদৃশ রয়েছে।



4
আমি নকলের একটি তালিকা সরানো চাই না। তালিকার নকল থাকলে কোনও তালিকাতেই আমি সত্য বা মিথ্যা জানতে চাই।
ব্যবহারকারী 847495

7
এই প্রশ্নটি নকল নয়। যেহেতু @ ব্যবহারকারীর 847495 কেবল অনুলিপি উপস্থিত রয়েছে কিনা তা পরীক্ষা করতে চায়, ডুপ্লিকেটগুলির সমস্ত উপস্থিতিগুলি সন্ধান করার জন্য সমাধানটি যা প্রয়োজন তার চেয়ে দ্রুত / সহজ। উদাহরণস্বরূপ, আপনি এটি করতে পারেন: codr.io/v/bvzxhqm
alden

4
আন্ডারস্কোর , সহজ কৌশল ব্যবহার করেvar test=['hello','goodbye','hello'] ; if ( test.length != _.unique(test).length ) { // some code }
সাঁই রাম

4
চিহ্নিত প্রশ্নের সদৃশ নয়। প্রশ্নগুলি চিহ্নিত করার আগে দয়া করে মনোযোগ দিন।
জন ওয়েইজ

উত্তর:


222

আপনার যদি ES2015 পরিবেশ থাকে (এই লেখার মতো: io.js, IE11, ক্রোম, ফায়ারফক্স, ওয়েবকাইট নাইট), তবে নিম্নলিখিতগুলি কাজ করবে এবং দ্রুত হবে (যেমন। ও (এন)):

function hasDuplicates(array) {
    return (new Set(array)).size !== array.length;
}

আপনার যদি অ্যারেতে কেবল স্ট্রিংয়ের মান প্রয়োজন হয় তবে নিম্নলিখিতগুলি কাজ করবে:

function hasDuplicates(array) {
    var valuesSoFar = Object.create(null);
    for (var i = 0; i < array.length; ++i) {
        var value = array[i];
        if (value in valuesSoFar) {
            return true;
        }
        valuesSoFar[value] = true;
    }
    return false;
}

আমরা একটি "হ্যাশ টেবিল" ব্যবহার করি valuesSoFarযার কীগুলি এখন পর্যন্ত অ্যারেতে দেখা মানগুলি। আমরা inমানটি ইতিমধ্যে চিহ্নিত করা হয়েছে কিনা তা ব্যবহার করে একটি অনুসন্ধান করি ; যদি তা হয়, আমরা লুপ থেকে জামিন এবং ফিরে true


আপনার যদি এমন কোনও ফাংশন প্রয়োজন যা কেবল স্ট্রিং মানগুলির চেয়ে বেশি কাজ করে, নিম্নলিখিতগুলি কাজ করবে তবে পারফর্মেন্ট হিসাবে নয়; এটি ও (এন 2 ) এর পরিবর্তে ও (এন 2 )।

function hasDuplicates(array) {
    var valuesSoFar = [];
    for (var i = 0; i < array.length; ++i) {
        var value = array[i];
        if (valuesSoFar.indexOf(value) !== -1) {
            return true;
        }
        valuesSoFar.push(value);
    }
    return false;
}

পার্থক্যটি হ'ল আমরা হ্যাশ টেবিলের পরিবর্তে একটি অ্যারে ব্যবহার করি valuesSoFarকারণ জাভাস্ক্রিপ্ট "হ্যাশ টেবিলগুলি" (অর্থাত্ বস্তুর) কেবল স্ট্রিং কী রয়েছে। এর অর্থ আমরা ও (1) দেখার সময়টি হারাব in, পরিবর্তে ও (এন) অনুসন্ধানের সময় পেয়ে যাচ্ছি indexOf


4
আপনার দেওয়া প্রথম উদাহরণ সম্পর্কে। বৈধতাটি ঠিক অন্যভাবে নয় কি? যদি আপনার ফাংশনটির নামকরণ করা হয় hasDuplicates, তবে সেটাকে ফেলে দেওয়ার প্রক্রিয়া চলাকালীন সেটটির আকারটি আসলে সঙ্কুচিত হয়েছে কিনা তা পরীক্ষা করা উচিত? অতএব বুলিয়ান অপারেটরটি হওয়া উচিত !==এবং না===
টিম ডাবেন্সচেটজ

pls সম্পাদনা করুন। আমি 6 টিরও বেশি অক্ষর পরিবর্তন করছি না বলে আমি সম্পাদনা করতে পারছি না।
টিম ডাবেন্সচেটজ

4
এমডিএন আইই 11 অনুসারে প্রথম উদাহরণে ব্যবহৃত কনস্ট্রাক্টরকে সমর্থন করে না
অ্যাডাম 77

সাধারণ জেএস সংস্করণ trueনিম্নলিখিত অ্যারেটির জন্য ফিরে আসে :[1, '1']
কুণাল

সুতরাং উত্তরটির পূর্ববর্তী "যদি আপনাকে কেবল অ্যারেতে স্ট্রিংয়ের মান প্রয়োজন হয়"।
ডোমেনিক

4

অন্য পদ্ধতির (অ্যারে 1 এর মধ্যে অবজেক্ট / অ্যারে উপাদানগুলির জন্যও ) 2 হতে পারে :

function chkDuplicates(arr,justCheck){
  var len = arr.length, tmp = {}, arrtmp = arr.slice(), dupes = [];
  arrtmp.sort();
  while(len--){
   var val = arrtmp[len];
   if (/nul|nan|infini/i.test(String(val))){
     val = String(val);
    }
    if (tmp[JSON.stringify(val)]){
       if (justCheck) {return true;}
       dupes.push(val);
    }
    tmp[JSON.stringify(val)] = true;
  }
  return justCheck ? false : dupes.length ? dupes : null;
}
//usages
chkDuplicates([1,2,3,4,5],true);                           //=> false
chkDuplicates([1,2,3,4,5,9,10,5,1,2],true);                //=> true
chkDuplicates([{a:1,b:2},1,2,3,4,{a:1,b:2},[1,2,3]],true); //=> true
chkDuplicates([null,1,2,3,4,{a:1,b:2},NaN],true);          //=> false
chkDuplicates([1,2,3,4,5,1,2]);                            //=> [1,2]
chkDuplicates([1,2,3,4,5]);                                //=> null

আরো দেখুন...

1 টির জন্য একটি ব্রাউজার দরকার যা জেএসএন সমর্থন করে, বা জেএসওএন লাইব্রেরি না থাকলে।
2 সম্পাদনা: ফাংশনটি এখন সাধারণ চেক বা ডুপ্লিকেট মানগুলির একটি অ্যারে ফেরত দিতে ব্যবহৃত হতে পারে


4
নন-শোস্টোপার বিষয়গুলি সম্পর্কে সচেতন হওয়া মূল্য: 1) মূল অ্যারেটিকে সাজানোর জন্য রূপান্তর করে; 2) মধ্যে পার্থক্য নেই null, NaN, Infinity, +Infinity, এবং -Infinity; 3) অবজেক্টগুলিকে সমান বিবেচনা করা হয় যদি তাদের নিজস্ব বৈশিষ্ট্যগুলি থাকে তবে তাদের বিভিন্ন প্রোটোটাইপ থাকলেও।
ডোমেনিক

4
@ ডমনিক: হ্যাঁ, এটি উল্লেখ করা উচিত ছিল। মূল অ্যারের পরিবর্তনের জন্য সম্পাদিত।
KooiInc

@ ডমোনিক: নাল / NaN / [+/-] অনন্তের জন্য সংশোধন করা হয়েছে, সম্পাদনাগুলি দেখুন।
KooiInc

@ ডমিনিক: ইস্যু 3) আসলে আমার পক্ষে সমস্যা নয়, কারণ এটি আমি যা চাই ঠিক তাই। আমি প্রোটোটাইপ, কেবল মানগুলি সম্পর্কে চিন্তা করি না।
অবাক

-3

ভাল আমি আপনার জন্য ইন্টারনেটে কিছুটা অনুসন্ধান করেছি এবং আমি এই সহজ লিঙ্কটি পেয়েছি।

একটি জাভাস্ক্রিপ্ট অ্যারেতে সদৃশ মানগুলি সন্ধান করার সহজ উপায়

উপরের লিঙ্কটিতে যে নমুনা কোড সরবরাহ করা হয়েছে তা আপনি নিজের সমাধানে "সুইলিয়ামস" এর সৌজন্যে গ্রহণ করতে পারেন।

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