सरणी अपने स्वयं के quirks है कि आप अगर आप अन्य भाषाओं से आते हैं उम्मीद नहीं की जा सकती है। आपके उपयोग के मामले के लिए दो महत्वपूर्ण हैं:
- आप सीधे जावास्क्रिप्ट में बहुआयामी सरणी घोषित नहीं कर सकते हैं।
- जब आप सृजन पर सरणी का आकार सेट करते हैं तो थोड़ा दक्षता लाभ (और कोई अतिरिक्त सुरक्षा नहीं) होती है।
अन्य भाषाओं के विपरीत, जावास्क्रिप्ट पूर्ण सरणी के लिए स्मृति का एक ब्लॉक आवंटित नहीं करेगा। (यह नहीं पता कि आप प्रत्येक सेल, में किस प्रकार की ऑब्जेक्ट्स डालने जा रहे हैं और इसलिए इसकी कुल मेमोरी की आवश्यकता होगी।) इसके बजाय, सभी size
Array()
पर तर्क आपके लिए सरणी सेट है length
संपत्ति।
सामान्य, 2 डी सरणी मामले के लिए, मेरा सुझाव चाहते हैं:
"टॉप" सरणी बनाएँ, उदा .:
var i // the first-order index in a
, j // the second order index in a
, a = []
प्रारंभ सरणी तत्व के रूप में की जरूरत है। इसे lazy initialization, कहा जाता है और, इस मामले में, इसमें a[i]
मौजूद है मौजूद है, इससे पहले कि हम a[i][j]
पर कुछ असाइन करने का प्रयास करें, उदाहरण के लिए,:
if (!a[i]) a[i] = []
अंग्रेजी में ऊपर बयान में लिखा है: "अगर a
की आई-वें तत्व 'falsy', आई-वें तत्व को एक खाली सरणी निर्दिष्ट करते हैं।"
अंत में, multideminsional सरणी के लिए वास्तविक मूल्य निर्दिष्ट:
a[i][j] = 'whatever'
अपने मामले के लिए, आप मूल्यों समय से आगे पता है, अतः आप पहले ही प्रत्येक तत्व को प्रारंभ कर सकते हैं। (आप तत्वों का सबसे अधिभावी नहीं कर रहे हैं, हालांकि, एक आलसी कार्यान्वयन बेहतर हो सकता है, नीचे देखें।)
var x, x_length = 100
, y, y_length = 100
, map = []
// Don't be lazy
for (x = 0; x < x_length; x++) {
map[x] = []
for (y = 0; y < y_length; y++) {
map[x][y] = 'grass.gif|ongrass.gif|collision.gif|above.gif'
}
}
के रूप में कुछ अन्य लोगों ने कहा, 100 तत्वों के साथ एक सरणी अनुक्रमित से गिने है शून्य से ninety-nine, तो तुलनात्मक रूप से तुलना में कम से कम यहां उचित है।
संदर्भ के लिए, यहां एक कार्यान्वयन है जो आलसी प्रारंभिक उपयोग करता है। मैं सीधे सरणी तक पहुंचने के बजाय फ़ंक्शन इंटरफ़ेस के साथ गया हूं; यह लंबा और अधिक जटिल है, लेकिन यह भी अधिक पूर्ण है।
प्रारंभिक पैटर्न मैंने यहां उपयोग किया है जिसे immediately invoked function expression कहा जाता है। यदि आपने इसे पहले नहीं देखा है, यह अधिक उपयोगी जावास्क्रिप्ट पैटर्न में से एक है और समझने के लिए कुछ समय लेना उचित है।
var map = (function (x_length, y_length, v_default, undefined) {
// Unless v_default is overwritten, use ...
v_default = v_default || 'grass.gif|ongrass.gif|collision.gif|above.gif'
// Private backing array; will contain only values for a[x][y]
// that were explicitly set.
var a = []
// Private helper function.
// - Returns `true` if `x` is between `0` and `x_length - 1`
// and `y` is between `0` and `y_length - 1`.
// - Returns `false` otherwise.
function valid (x, y) {
return (x >= 0
&& x < x_length
&& y >= 0
&& y < y_length)
}
// Private helper function.
// - Returns `true` if a[x][y] has been set().
// - Returns `false` otherwise.
function exists (x, y) {
return !!a[x] && !!a[x][y]
}
// Private getter
// - Returns the value of a[x][y] if it has been set().
// - Returns `undefined` if the point (x,y) is invalid.
// - Returns `v_default` otherwise.
function get (x, y) {
if (!valid(x, y)) return undefined
else if (exists(x, y)) return a[x][y]
else return v_default
}
// Private setter
// - Returns the value set on success.
// - Returns `undefined` on failure
function set (x, y, v) {
if (valid(x, y)) {
// We're being lazy
if (!a[x]) a[x] = []
a[x][y] = v
return a[x][y]
}
return undefined
}
// Return an interface function.
// - Pass the function three arguments, (x, y, v), to set a[x][y] = v
// - Pass the function two arguments, (x, y), to get a[x][y]
return function (x, y, v) {
if (arguments.length > 2) {
return set(x, y, v)
} else {
return get(x, y)
}
}
})(100, 100)
जब मैं नोड में ऊपर दिखाया गया है, तो निम्न परीक्षण मुद्रित समझदार मान:
// Invalid invocations
console.log('map() : %s', map())
console.log('map( 0) : %s', map(0))
console.log('map(-1, 0) : %s', map(-1,0))
console.log('map( 0, -1) : %s', map(0, -1))
console.log('map(-1, -1) : %s', map(-1, -1))
// Valid invocations
console.log('map( 0, 0) : %s', map(0, 0))
console.log('map(99, 99) : %s', map(99, 99))
console.log('map( 1, 1) : %s', map(1,1))
console.log('map( 1, 1, "foo") : %s', map(1,1, 'foo'))
console.log('map( 1, 1) : %s', map(1,1))
* क्यों है हो रहा * 'क्योंकि world_map_array [i]' 'कुछ बिंदु पर undefined' है?। यदि किसी सरणी की लंबाई है, तो कहें, '3', तो अनुक्रमणिका' 0', '1',' 2' हैं। साथ ही, यदि आपने किसी इंडेक्स को कोई मान नहीं दिया है, तो यह 'अपरिभाषित' होगा। –
मैं इसे कैसे ठीक करूं? – user1406186
जो मैं करने की कोशिश कर रहा हूं वह टाइल मानचित्र का प्रतिनिधित्व करने के लिए दो आयामी सरणी बना रहा है। जैसे '[0,0] [1,0] [2,0] [0,1] [1,1] [2,1] [0,2] [1,1] [2,2] ' – user1406186