जावास्क्रिप्ट में, मैं कैसे जांचूं कि किसी सरणी में डुप्लिकेट मान हैं?


95

संभव डुप्लिकेट:
एक जावास्क्रिप्ट सरणी में डुप्लिकेट मान खोजने के लिए सबसे आसान तरीका

यदि किसी सरणी में डुप्लिकेट मान हैं, तो मैं कैसे जांच करूं?

यदि सरणी में कुछ तत्व समान हैं, तो सही लौटें। नहीं तो झूठा लौट आता है।

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

ध्यान दें कि मुझे डुप्लिकेट खोजने की परवाह नहीं है, केवल बूलियन परिणाम चाहते हैं कि क्या सरणियों में डुप्लिकेट शामिल हैं।



2
मुझे डुप्लिकेट की सूची नहीं हटाई गई है। मैं बस सही या गलत जानना चाहता हूं कि क्या किसी सूची में डुप्लिकेट है।
user847495

7
यह प्रश्न डुप्लिकेट नहीं है। चूंकि @ user847495 केवल यह जांचना चाहता है कि क्या डुप्लिकेट मौजूद है, इसलिए डुप्लिकेट के सभी घटनाओं को खोजने के लिए जो आवश्यक है, उसकी तुलना में समाधान तेज / आसान है। : उदाहरण के लिए, आप यह कर सकते हैं codr.io/v/bvzxhqm
Alden

2
अंडरस्कोर का उपयोग करके , सरल तकनीकvar test=['hello','goodbye','hello'] ; if ( test.length != _.unique(test).length ) { // some code }
साईं राम

4
चिह्नित प्रश्न का डुप्लिकेट नहीं। कृपया प्रश्नों को चिह्नित करने से पहले ध्यान दें।
जॉन वीज़

जवाबों:


220

यदि आपके पास ES2015 वातावरण है (इस लेखन के रूप में: io.js, IE11, Chrome, Firefox, WebKit रात में), तो निम्नलिखित काम करेगा, और तेज़ होगा (viz। O (n)):

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


यदि आपको एक फ़ंक्शन की आवश्यकता है जो केवल स्ट्रिंग मानों से अधिक के लिए काम करता है, तो निम्नलिखित काम करेगा, लेकिन प्रदर्शनकर्ता के रूप में नहीं है; यह O (n ) के बजाय O (n 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, क्योंकि जावास्क्रिप्ट "हैश टेबल" (यानी ऑब्जेक्ट) में केवल स्ट्रिंग कुंजी हैं। इसका अर्थ है कि हम inO (n) लुकअप समय प्राप्त करने के बजाय O (1) लुकअप समय खो देते हैं indexOf


3
आपके द्वारा दिए गए पहले उदाहरण के बारे में। क्या मान्यता बिल्कुल अन्य तरह से नहीं है? यदि आपका फ़ंक्शन नाम है hasDuplicates, तो यह जांचना चाहिए कि क्या सेट की प्रक्रिया के दौरान सेट का आकार वास्तव में सिकुड़ गया है, है ना? इसलिए बूलियन ऑपरेटर होना चाहिए !==और नहीं===
टिम Daubenschütz

pls संपादित करें। मैं संपादित नहीं कर सकता क्योंकि मैं 6 से अधिक वर्ण नहीं बदल रहा हूं।
टिम डबेंसचटज़

1
के अनुसार MDN IE11 नहीं समर्थन निर्माता पहले उदाहरण में प्रयुक्त करता है
adam77

सामान्य जेएस संस्करण trueनिम्न सरणी के लिए लौटाता है :[1, '1']
कुणाल

इस प्रकार "यदि आपको उत्तर में पूर्व में केवल स्ट्रिंग मान की आवश्यकता है"।
Domenic

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 को एक ब्राउज़र की आवश्यकता है जो JSON या JSON लाइब्रेरी का समर्थन करता हैयदि नहीं।
2 संपादित करें: फ़ंक्शन का उपयोग अब साधारण चेक के लिए या डुप्लिकेट मानों की एक सरणी वापस करने के लिए किया जा सकता है


3
गैर-शोस्टॉपर मुद्दों के बारे में पता होने के लायक: 1) मूल सरणी को हल करने के लिए म्यूट करता है; 2) के बीच अंतर नहीं है null, NaN, Infinity, +Infinity, और -Infinity; 3) वस्तुओं को समान माना जाता है यदि उनके समान गुण हैं, भले ही उनके अलग-अलग प्रोटोटाइप हों।
डोमोनिक

1
@ महिला: हाँ, यह उल्लेख किया है चाहिए। मूल सरणी के उत्परिवर्तन को रोकने के लिए संपादित किया गया।
KooiInc

@ डॉमिक: अशक्त / NaN / [+/-] इन्फिनिटी के लिए सही, संपादन देखें।
KooiInc

@ डोमिनिक: अंक 3) वास्तव में मेरे लिए कोई समस्या नहीं है, क्योंकि यह वही है जो मैं चाहता हूं। मैं प्रोटोटाइप के बारे में परवाह नहीं है, सिर्फ मूल्यों।
विस्मयकारी

-4

वैसे मैंने आपके लिए इंटरनेट पर थोड़ी खोज की और मुझे यह आसान लिंक मिला।

जावास्क्रिप्ट सरणी में डुप्लिकेट मान खोजने के लिए सबसे आसान तरीका

आप ऊपर दिए गए लिंक में दिए गए नमूना कोड को अनुकूलित कर सकते हैं, "विलियम्स" के सौजन्य से आपके समाधान के लिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.