2011-07-10 16 views
8

मैं एक वस्तु बनाने के लिए, की तरह कुछ से शुरू करना चाहते हैं:जावास्क्रिप्ट: बहु-आयामी वस्तु

var map = {}; 

फिर, मैं इस समारोह के साथ आइटम जोड़ना चाहते हैं:

add = function(integerA, objectB) { 
    map[objectB.type][integerA] = objectB; 
} 

तो, यह है ऑब्जेक्ट स्ट्रक्चर का एक यादृच्छिक उदाहरण जिसे मैं प्राप्त करना चाहता हूं:

map = { 
    'SomeType' : { 0 : 'obj', 2 : 'obj', 3 : 'obj' }, 
    'OtherType' : { 0 : 'obj', 5 : 'obj' }, 
}; 

अब, मेरी समस्या। मैं map[objectB.type][integerA] = objectB; नहीं कर सकता क्योंकि map[objectB.type] परिभाषित नहीं किया गया है। मैं यह जांच कर हल कर सकता हूं कि map[objectB.type] एक if-statement के माध्यम से मौजूद है और आवश्यक होने पर map[objectB.type] = {}; बनाएं।

अन्यथा मैं सभी ऑब्जेक्ट प्रकारों को प्री-लोड कर सकता था। हालांकि मैं ऐसा नहीं करना पसंद करूंगा।

मेरा प्रश्न: क्या कोई तरीका है कि मैं ऑब्जेक्ट 'फ्लाई पर' बना सकता हूं, यह जांचने के बिना कि क्या मैं पहले से मौजूद हूं, अगर मैं add फ़ंक्शन को कॉल करना चाहता हूं या सभी प्रकारों को प्री-लोड करना चाहता हूं?

यह महत्वपूर्ण है कि मेरा ऐड फ़ंक्शन जितना तेज़ हो सके और नक्शा ऑब्जेक्ट सही है, क्योंकि मुझे थोड़ी सी मात्रा में पढ़ने और लिखने की आवश्यकता है (यह एक एनीमेशन/गेम एप्लिकेशन है)।

+1

क्या आप वाकई एक प्रदर्शन समस्या होगी? अगर मैं तुम थे, तो मैं इसे पहले कोशिश करूँगा और देख सकता हूं कि यह एक समस्या है या नहीं। दिन के अंत में, आपको या तो चेक, या जावास्क्रिप्ट इंजन करने की आवश्यकता होगी, इसलिए निर्देशों को –

+0

पर संसाधित करने की आवश्यकता होगी। इस लिंक में आपके प्रश्न का उत्तर http://stackoverflow.com/प्रश्न/7744611/पास-वैरिएबल-बाय-रेफरेंस-इन-जावास्क्रिप्ट –

उत्तर

9

नहीं, फ्लाई पर ऑब्जेक्ट्स बनाने का कोई और तरीका नहीं है। केवल अस्तित्व के लिए हर बार की जाँच करें:

add = function(integerA, objectB) { 
    if (!map[objectB.type]) { 
     map[objectB.type] = {};   
    } 
    map[objectB.type][integerA] = objectB; 
} 

आप प्रदर्शन आप कुछ कैशिंग टेकनीक पर विचार हो सकता में सुधार करना चाहते हैं।

+0

मैं सभी उत्तरों की सराहना करता हूं, यह सबसे स्पष्ट है। मैं तब प्रकारों को प्री-लोड करना चुनूंगा। – user8363

3

आप बुलियन या शॉर्टकट का उपयोग कर सकते हैं (जो कम से कम एक स्पष्ट if से बचाता है)। हालांकि यह है कि पढ़ने योग्य नहीं हो सकता है:

var data = map[objectB.type] || (map[objectB.type] = {}); 
data[integerA] = objectB; 

यह काम करता है क्योंकि एक काम वास्तव में मूल्य है कि सौंपा गया था वापस आती है और एक या अभिव्यक्ति पहला मान कि true का मूल्यांकन देता है।

मुझे नहीं लगता कि if का उपयोग प्रदर्शन पर कोई असर पड़ता है (वास्तव में, मेरे उत्तर में जिस तरह से "धीमा" हो सकता है)।

3

यदि आप केवल लुकअप के लिए मानचित्र का उपयोग करते हैं और आपको आयामों पर पुनरावृत्ति करने की आवश्यकता नहीं है, तो आप अपने आयामों को एक कुंजी में विलय कर सकते हैं। उदाहरण के लिए:

add = function(integerA, objectB) { 
    var key = objectB.type + '-' + integerA; 
    map[key] = objectB; 
} 
संबंधित मुद्दे