2012-04-16 10 views
5

मैं अजगर पर एक सरल उदाहरण है:जावास्क्रिप्ट में सरणी के रूप में सरणी का उपयोग कैसे करें?

programs = {} 
if not programs.has_key((program, time)): 
    programs[(program, time)] = 0 
programs[(program, time)] = programs[(program, time)] + 1 

कैसे जावास्क्रिप्ट में कुंजी के रूप में उपयोग करने के लिए सरणी?

+1

क्या आपका मतलब है कि आप हैश में लुकअप के रूप में सरणी का उपयोग करना चाहते हैं? – alex

+1

'प्रोग्राम' और' समय 'के संभावित मानों के आधार पर, शायद कुंजी के रूप में' [प्रोग्राम, समय] 'के स्ट्रिंग प्रस्तुति का उपयोग करने में कोई समस्या नहीं हो सकती है। चूंकि आप प्रॉपर्टी के रूप में उपयोग किए जाने वाले मान को स्वचालित रूप से स्ट्रिंग में परिवर्तित कर देते हैं, इसलिए उपयोग सरल होता है। –

+0

जैसे रोब ने कहा, ** "program_time" ** की तरह कुंजी को कस्टम करें, और इसे अपने आप से संभाल लें – tym1193

उत्तर

3

क्या यह आपके लिए चाल करेगा?

jsfiddle

<script> 
var ary = {person1:'valerie', person2:'alex'}; 
for (key in ary) { 
    document.write(key, '<br>') 
} 

document.write(ary['person2'], '<br>') 
</script> 
8

जावास्क्रिप्ट कुंजी तार हैं।

आपको WeakMap, या अन्य ऑब्जेक्ट्स को सरणी को मैप करने के लिए एक कस्टम विधि की आवश्यकता है।

+3

map.set ([1,2], 'woo'); map.get ([1,2]) -> अपरिभाषित। इस तरह से एक सरणी का उपयोग करने का कोई तरीका है? –

+2

'[1, 2]' और '[1, 2] 'अलग-अलग वस्तुएं हैं। 'Var arr = [1, 2];' 'map.set (arr, 'woo') का उपयोग करें; 'और' map.get (arr,' woo '); '। यदि आप सरणी के संदर्भ को बरकरार नहीं रख सकते हैं, तो आपको इसे किसी भी तरह से क्रमबद्ध/हैश करना होगा। Naively, उदा। एक कुंजी के रूप में 'arr.join (',') 'का उपयोग कर। –

+0

हाँ मैंने इसे कुछ अजीब तरीके से खत्म कर दिया :) मैं तारों का उपयोग नहीं करना चाहता था क्योंकि यह शायद एक बार में लाखों बार हो रहा है। बहुत बुरा - सरणी अच्छा होगा। –

16

यह होगा "काम"। (लेकिन मैं इसकी सलाह नहीं देते)

var a = {}; 
var b = [1,2,3];  
a[b] = 'hello'; 

// a[b] evaluates to 'hello' 
// a[[1,2,3]] evaluates to 'hello' 
// a['1,2,3'] evaluates to 'hello' 

यह काम करता है, क्योंकि जब आप हैश (मानचित्र/साहचर्य सरणी) कुंजी के रूप में सरणी [1,2,3] गुजरती हैं, स्ट्रिंग के लिए परिवर्तित किया जा रहा है ' हैश लुकअप करने से पहले 1,2,3 '। जब तक आपको विभिन्न हैश मानों को मैप करने के लिए समान मूल्य के दो अलग-अलग सरणी की आवश्यकता नहीं होती है, तब तक यह आपकी आवश्यकताओं के अनुरूप होना चाहिए।

var c = [1,2,3] 
// a[c] evaluates to 'hello' even though we never executed a[c] = 'hello' 
// but b == c evaluates to false 
// b & c are two separate objects with the same values, so when they 
// get converted to a string for hashing, they return the same value from the hash 

के रूप में यह उल्लेख किया गया था, तो आप मानक जावास्क्रिप्ट हैश की तुलना में अधिक की आवश्यकता होगी आप अपने कुंजी के रूप में वस्तु संदर्भ का उपयोग करना चाहते हैं।

अद्यतन

@speedplane से टिप्पणी के आधार पर:

मुझे लगता है कि जे एस सरणी जब आप इसे एक हैश कुंजी में पारित पर toString() कहता है। ताकि आप आसानी से परीक्षण कर सकते हैं क्या आप वास्तव में अपने कुंजी के रूप में प्राप्त करने के लिए जा रहे हैं:

["x", "y", "z"].toString;    // 'x,y,z' 
["x,y,z"].toString();     // 'x,y,z' 
[1,2,3].toString();      // '1,2,3' 
[1,2,'3'].toString();     // '1,2,3' 
[[1],[2],[3]].toString();    // '1,2,3' 
[["x",1], ["y",2], ["z",3]].toString(); // 'x,1,y,2,z,3' 

तो फिर, मैं सुझाव है कि आप ऐसा नहीं करते हैं यह जब तक आप वास्तव में समझ में क्या चल रहा है। और फिर भी, मैं यह नहीं करूँगा।

+0

ध्यान दें कि यदि आप कुंजी के रूप में तारों की सरणी का उपयोग कर रहे हैं तो यह इतना अच्छा काम नहीं करता है। उदाहरण के लिए, 'var a = {}; var बी = ["एक्स", "वाई", "जेड"]; var सी = ["एक्स, वाई, जेड"]; एक [बी] = 'ओह ओह'; एक [सी] ''ओह ओह' का मूल्यांकन करेगा। एक ही ऑब्जेक्ट कुंजी पर दो अलग-अलग सरणी 'बी' और' सी' मानचित्र। – speedplane

+0

@ स्पीडप्लेन उस बिंदु को इंगित करने के लिए धन्यवाद। मैंने आपके उत्तरों के साथ अपना जवाब अपडेट किया। इसके अलावा, मैंने स्पष्ट रूप से कहा है कि मैं यह अनुशंसा नहीं करता कि आप ऐसा करें। –

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