2012-05-25 17 views
22

पर डुप्लिकेट कुंजी जोड़ने से रोकने के लिए कैसे मुझे जवाब के साथ बहुत से संबंधित प्रश्न मिलते हैं ... लूप में और hasOwnProperty का उपयोग करते हुए, लेकिन कुछ भी नहीं जो मैं ठीक से काम करता हूं। मैं बस इतना करना चाहता हूं कि सरणी में कोई कुंजी मौजूद है या नहीं, और यदि नहीं, तो इसे जोड़ें।जावास्क्रिप्ट सरणी

मैं एक खाली सरणी से शुरू करता हूं, फिर कुंजी जोड़ें क्योंकि पेज jQuery के साथ साफ़ किया जाता है।

प्रारंभ में, मैं आशा व्यक्त की कि कुछ निम्नलिखित की तरह साधारण काम करेगा: (सामान्य नाम का उपयोग)

if (!array[key]) 
    array[key] = value; 

नहीं जाने। इसे बाद:

for (var in array) { 
    if (!array.hasOwnProperty(var)) 
     array[key] = value; 
} 

भी करने की कोशिश की:

if (array.hasOwnProperty(key) == false) 
    array[key] = value; 

इस में से कोई भी काम किया है। या तो सरणी में कुछ भी नहीं धकेल दिया गया है या जो मैं कोशिश करता हूं वह array[key] = value घोषित करने से बेहतर नहीं है, ऐसा करना इतना आसान क्यों है। यह काम करने के लिए कोई विचार?

+3

आप 'ऐरे' या 'ऑब्जेक्ट' पर प्रयास कर रहे हैं? – thecodeparadox

+0

ES6 में अब [सेट] है (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set) मूल – Efren

उत्तर

32

सामान्यतया यह वास्तव में साहचर्य सरणियों नहीं है बजाय जावास्क्रिप्ट के बाद से एक वस्तु के साथ बेहतर पूरा किया है:

var foo = { bar: 0 }; 

एक कुंजी के लिए जाँच करने in का उपयोग करें:

if (!('bar' in foo)) { 
    foo['bar'] = 42; 
} 

के रूप में था नीचे दी गई टिप्पणियों में सही ढंग से इंगित किया गया है, यह विधि केवल है जब आपकी चाबियाँ स्ट्रिंग होंगी, या आइटम जिन्हें तारों (जैसे संख्याओं) के रूप में प्रदर्शित किया जा सकता है।

+2

... यह मानते हुए कि आपके मान तारों या अद्वितीय तारों के रूप में प्रतिनिधित्व योग्य हैं (इसमें संख्याएं शामिल हैं)। – Phrogz

+0

@Phrogz बिल्कुल। ओपी को सलाह की अच्छी सलाह। – Sampson

+3

धन्यवाद जोनाथन। प्रकाश ने आखिरकार क्लिक किया कि मैं क्या गलत कर रहा था। मैं कहने वाला था कि आपका जवाब या तो मदद नहीं करता था, लेकिन थोड़ी अधिक जासूसी के काम के बाद, मुझे यह कहते हुए खुशी हो रही है कि यह पूरी तरह से काम करता है। और ऑब्जेक्ट्स पर युक्तियों के लिए धन्यवाद। मैं इसे सड़क पर दिमाग में रखूंगा। – iamsar

21
var a = [1,2,3], b = [4,1,5,2]; 

b.forEach(function(value){ 
    if (a.indexOf(value)==-1) a.push(value); 
}); 

console.log(a); 
// [1, 2, 3, 4, 5] 

अधिक जानकारी के Array.indexOf पर पढ़ें।

आप jQuery पर भरोसा चाहते हैं, बजाय का उपयोग jQuery.inArray:

$.each(b,function(value){ 
    if ($.inArray(value,a)==-1) a.push(value); 
}); 

अपने सभी मूल्यों बस और विशिष्ट रूप से, तार के रूप में प्रदर्शनीय हैं फिर भी, आप किसी सरणी के बजाय एक वस्तु का उपयोग करना चाहिए, तो एक संभावित भारी गति वृद्धि के लिए (जैसा कि @ जोनाथन सैम्पसन द्वारा उत्तर में वर्णित है)।

+0

इसके अलावा, 'इंडेक्सऑफ' का उपयोग करने में समस्या यह है कि यह स्वयं एक लूप बनाता है ... यह एक [श्लेमेल चित्रकार के एल्गोरिदम] (http://en.wikichip.org/wiki/Schlemiel_the_Painter's_Algorithm) के लिए बनाता है जो धीमा हो जाता है सरणी में जोड़े गए प्रत्येक आइटम के साथ। –

0

तर्क गलत है। इस पर विचार करें:

x = ["a","b","c"] 
x[0]  // "a" 
x["0"] // "a" 
0 in x // true 
"0" in x // true 
x.hasOwnProperty(0) // true 
x.hasOwnProperty("0") // true 

वहाँ पाश करने का कोई कारण कुंजी (या सूचकांक सरणियों के लिए) होने की जाँच करने के लिए है। अब, मूल्य एक अलग कहानी है ...

मुबारक कोडिंग

0
function check (list){ 
    var foundRepeatingValue = false; 
    var newList = []; 
    for(i=0;i<list.length;i++){ 
     var thisValue = list[i]; 
     if(i>0){ 
      if(newList.indexOf(thisValue)>-1){ 
       foundRepeatingValue = true; 
       console.log("getting repeated"); 
       return true; 
      } 
     } newList.push(thisValue); 
    } return false; 
} 

 

var list1 = ["dse","dfg","dse"]; 
check(list1); 

आउटपुट:

getting repeated 
true 
संबंधित मुद्दे