2013-05-19 4 views
7

मैं, ऐसाजावास्क्रिप्ट - नियंत्रण दो आयामी गतिशील सरणी

var dynamic = new Array(); 
dynamic[] = new Array(); 


तत्व (शायद) सीमित नहीं करते के बाद मैं विशेष के लिए मूल्य जोड़ना चाहते हैं जावास्क्रिप्ट में एक दो आयामी गतिशील सरणी init करना चाहते हैं सरणी

dynamic[id].push(2); // id = 3, dynamic[3][0] = 2 
... 
dynamic[id].push(3); // id = 3, dynamic[3][1] = 3 
... 
dynamic[id].push(5); // id = 5, dynamic[5][0] = 5 

यह संभव है? मैं कैसे है कि, धन्यवाद

+0

तुम्हारा मतलब है तुम सूचकांक आप 'dynamic' पर उपयोग करने के लिए स्वचालित रूप से अगर यह मौजूद नहीं है की कोशिश पर एक नया खाली सरणी प्राप्त करना चाहते हैं? – Dogbert

+0

आप सीधे 2 डी सरणी शुरू नहीं कर सकते हैं। हालांकि आप प्रभावी रूप से 2 डी बनाने के लिए अपने प्रारंभिक सरणी में 'पुश() 'सरणी तत्वों को धक्का दे सकते हैं। – techfoobar

+0

आप 2 डी सरणी चाहते हैं ??? –

उत्तर

5

एक बात तुम कर सकते हो कुछ इस तरह (jsfiddle) है कर सकते हैं:

var dynamic = []; 

dynamic.push = function (id, value) { 
    if (!this[id]) { 
     this[id] = []; 
    } 

    this[id].push(value); 
} 

dynamic.push(3, 2); 
dynamic.push(3, 3); 
dynamic.push(5, 5); 
बेशक

, इस और भी बेहतर किया जा सकता है, लेकिन यह बात भर में हो जाता है। व्यक्तिगत रूप से, मैं इसके लिए एक कक्षा लिखूंगा।

संपादित: इसके अलावा, यह ध्यान रखें कि इस undefined मूल्यों, जो जब यह से पढ़ने का ध्यान रखा जाना करने की जरूरत है की एक पूरी बहुत कुछ होने के एक उच्च क्षमता के साथ एक सरणी पैदा करता है। इसके अलावा, इस तरह के छेद वाले सरणी खराब प्रदर्शन करते हैं (यदि यह एक मुद्दा होगा - कुछ के लिए, यहां तक ​​कि कुछ सौ, मूल्य, इससे कोई फर्क नहीं पड़ता)।

+0

धन्यवाद, यह अच्छा है :) – DeLe

+0

@ इंगो बर्क +1 और आपके उत्तर के लिए धन्यवाद, क्या आप पोस्ट कर सकते हैं मैं इस बहुआयामी सरणी से मूल्य कैसे प्राप्त करूं: 'मुझे केवल आवश्यकता है आईडी = 3 मान जैसे (3,2) और (3,3) ' –

0

ओवरराइटिंग push शायद सबसे अच्छी योजना नहीं हो सकती है। एक और विधि/फ़ंक्शन जोड़ना इसे समझने में आसान बना देगा। किसी ने push(1,3) पढ़ने आप एक सरणी पर बजाय 3 की मद में 1 और 3 धक्का कर रहे हैं मान सकता है 1.

var dynamic = []; 

dynamic.item = function(index) { 
    if (!dynamic[index]) { 
     dynamic[index] = []; 
    } 
    return dynamic[index]; 
} 

इस आप निम्नलिखित करने की अनुमति देगा:

dynamic.item(1).push(1)

अगर " आइटम "मौजूद नहीं है, यह इसके लौटने से पहले बनाया गया है, और यह आपको अपने सरणी के दोनों आयामों पर सभी सरणी विधियों का उपयोग करने की अनुमति देता है। (i beleive)

आप इसे ऐरे प्रोटोटाइप में जोड़कर थोड़ा और सामान्य बना सकते हैं जो आपको इसे सभी सरणी पर उपयोग करने देगा।

Array.prototype.item = function(index) { 
    if (!this[index]) { 
     this[index] = init; 
    } 
    return this[index]; 
} 
+0

हाँ, जैसे मैंने कहा, बेहतर तरीके हैं। और मैं अब भी सबसे ज्यादा कक्षा बनाना पसंद करूंगा। :) –

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