2012-02-14 18 views
22
var associativeArray = []; 

associativeArray['key1'] = 'value1'; 
associativeArray['key2'] = 'value2'; 
associativeArray['key3'] = 'value3'; 
associativeArray['key4'] = 'value4'; 
associativeArray['key5'] = 'value5'; 

var key = null; 
for(key in associativeArray) 
{ 
    console.log("associativeArray[" + key + "]: " + associativeArray[key]);   
} 

key = 'key3'; 

var obj = associativeArray[key];   

// gives index = -1 in both cases why? 
var index = associativeArray.indexOf(obj); 
// var index = associativeArray.indexOf(key); 

console.log("obj: " + obj + ", index: " + index); 

उपरोक्त प्रोग्राम इंडेक्स प्रिंट करता है: -1, क्यों? क्या लूप का उपयोग किये बिना किसी एसोसिएटिव सरणी में ऑब्जेक्ट की अनुक्रमणिका प्राप्त करने का कोई बेहतर तरीका है?जावास्क्रिप्ट: एक एसोसिएटिव सरणी में किसी ऑब्जेक्ट की अनुक्रमणिका कैसे प्राप्त करें?

यदि मैं इस सरणी से 'key3' को हटाना चाहता हूं तो क्या होगा? स्प्लिस फ़ंक्शन पहले पैरामीटर को इंडेक्स के रूप में लेता है जो एक पूर्णांक होना चाहिए।

+8

जावास्क्रिप्ट में कोई सहयोगी सरणी नहीं है। – Sarfraz

+0

[जावास्क्रिप्ट ऑब्जेक्ट में, किसी मूल्य की विशेषता प्राप्त करने का सबसे अच्छा तरीका क्या है?] (Http://stackoverflow.com/questions/9052888/in-a-javascript-object-whats-best-way-to के संभावित डुप्लिकेट -get-the-attribute-of-a-value) – user123444555621

+0

http://andrewdupont.net/2006/05/18/javascript-associative-arrays-Considered-harmful/ –

उत्तर

34

indexOf केवल शुद्ध जावास्क्रिप्ट सरणी के साथ काम करता है, यानी पूर्णांक अनुक्रमणिका वाले लोग। आपका "सरणी" वास्तव में एक वस्तु है और के रूप में ऐसी

var associativeArray = {} 

घोषित किया जाना चाहिए नहीं है कोई वस्तुओं के लिए निर्मित indexOf, लेकिन यह लिखने के लिए आसान है।

var associativeArray = {} 

associativeArray['key1'] = 'value1'; 
associativeArray['key2'] = 'value2'; 
associativeArray['key3'] = 'value3'; 
associativeArray['key4'] = 'value4'; 
associativeArray['key5'] = 'value5'; 

var value = 'value3'; 
for(var key in associativeArray) 
{ 
    if(associativeArray[key]==value) 
     console.log(key); 
} 
छोरों के बिना

(एक आधुनिक ब्राउज़र कल्पना करते हुए):

foundKeys = Object.keys(associativeArray).filter(function(key) { 
    return associativeArray[key] == value; 
}) 

कुंजी है जो दिए गए मान की एक सरणी देता है।

+1

यदि मैं इससे 'key3' को हटाना चाहता हूं तो क्या होगा सरणी? स्प्लिस फ़ंक्शन पहले पैरामीटर को इंडेक्स के रूप में लेता है जो एक पूर्णांक होना चाहिए। – gmuhammad

+2

@gmuhammad 'splice() 'विधि केवल सरणी पर चलती है, ऑब्जेक्ट्स नहीं। उदाहरण के लिए, आपको 'सहयोगी ऐरे [' key3 '] हटाकर' संपत्ति को हटाने की आवश्यकता होगी। – GregL

+3

thg435: आपने शायद अपने परिवर्तनीय नाम में 'सरणी' शब्द का उपयोग करके थोड़ा भ्रम पैदा किया है। शायद 'सहयोगी मैप' स्पष्ट हो सकता है कि यह एक वस्तु है, एक सरणी नहीं है? – GregL

2

आप jQuery का उपयोग नहीं करते हैं, तो आप यह कर वस्तु के प्रोटोटाइप का विस्तार कर सकते हैं:

// Returns the index of the value if it exists, or undefined if not 
Object.defineProperty(Object.prototype, "associativeIndexOf", { 
    value: function(value) { 
     for (var key in this) if (this[key] == value) return key; 
     return undefined; 
    } 
}); 

आम Object.prototype.associativeIndexOf = ... के बजाय इस तरह का प्रयोग jQuery के साथ काम करेंगे अगर आप इसका इस्तेमाल।

और फिर आप इस तरह इसका इस्तेमाल कर सकते हैं:

var myArray = {...}; 
var index = myArray.associativeIndexOf(value); 

यह भी सामान्य सरणियों के साथ काम करेंगे: [...], ताकि आप इसे indexOf के बजाय भी इस्तेमाल कर सकते हैं।

जाँच करने के लिए ट्रिपल-चरित्र ऑपरेटरों का उपयोग करने के लिए याद रखें अगर यह अपरिभाषित है:

index === undefined // to check the value/index exists  
index !== undefined // to check the value/index does not exist 
बेशक

आप यदि आप उदाहरण keyOf के लिए पसंद करते हैं फ़ंक्शन का नाम बदल सकता है, और किसी भी चर घोषित करने के लिए नहीं याद 'अपरिभाषित' कहा जाता है।

संबंधित मुद्दे