2012-05-20 15 views
12

मैं इस पंक्ति में किसी कारण से त्रुटिUncaught TypeError: गुण सेट नहीं किया जा सकता '0' अपरिभाषित की "

Uncaught TypeError: Cannot set property '0' of undefined

हो रही है

world_map_array[i][z]="grass.gif|ongrass.gif|collision.gif|above.gif"; 

हो रहा क्यों है

? किसी भी मदद के लिए धन्यवाद

var x_world_map_tiles = 100; 
var y_world_map_tiles = 100; 

var world_map_array = new Array(x_world_map_tiles); 
for (i=0; i<=2; i++)//create a two dimensional array so can access the map through x and y coords map_array[0][1] etc. 
{ 
world_map_array[i]=new Array(y_world_map_tiles); 
} 


for (i=0; i<=x_world_map_tiles; i++)//just a test 
{ 
for (z=0; z<=y_world_map_tiles; z++)//just a test 
{ 
world_map_array[i][z]="grass.gif|ongrass.gif|collision.gif|above.gif"; 
} 
} 
+1

* क्यों है हो रहा * 'क्योंकि world_map_array [i]' 'कुछ बिंदु पर undefined' है?। यदि किसी सरणी की लंबाई है, तो कहें, '3', तो अनुक्रमणिका' 0', '1',' 2' हैं। साथ ही, यदि आपने किसी इंडेक्स को कोई मान नहीं दिया है, तो यह 'अपरिभाषित' होगा। –

+0

मैं इसे कैसे ठीक करूं? – user1406186

+0

जो मैं करने की कोशिश कर रहा हूं वह टाइल मानचित्र का प्रतिनिधित्व करने के लिए दो आयामी सरणी बना रहा है। जैसे '[0,0] [1,0] [2,0] [0,1] [1,1] [2,1] [0,2] [1,1] [2,2] ' – user1406186

उत्तर

26

सरणी अपने स्वयं के quirks है कि आप अगर आप अन्य भाषाओं से आते हैं उम्मीद नहीं की जा सकती है। आपके उपयोग के मामले के लिए दो महत्वपूर्ण हैं:

  1. आप सीधे जावास्क्रिप्ट में बहुआयामी सरणी घोषित नहीं कर सकते हैं।
  2. जब आप सृजन पर सरणी का आकार सेट करते हैं तो थोड़ा दक्षता लाभ (और कोई अतिरिक्त सुरक्षा नहीं) होती है।

अन्य भाषाओं के विपरीत, जावास्क्रिप्ट पूर्ण सरणी के लिए स्मृति का एक ब्लॉक आवंटित नहीं करेगा। (यह नहीं पता कि आप प्रत्येक सेल, में किस प्रकार की ऑब्जेक्ट्स डालने जा रहे हैं और इसलिए इसकी कुल मेमोरी की आवश्यकता होगी।) इसके बजाय, सभी sizeArray() पर तर्क आपके लिए सरणी सेट है length संपत्ति।

सामान्य, 2 डी सरणी मामले के लिए, मेरा सुझाव चाहते हैं:

  1. "टॉप" सरणी बनाएँ, उदा .:

    var i  // the first-order index in a 
        , j  // the second order index in a 
        , a = [] 
    
  2. प्रारंभ सरणी तत्व के रूप में की जरूरत है। इसे lazy initialization, कहा जाता है और, इस मामले में, इसमें a[i] मौजूद है मौजूद है, इससे पहले कि हम a[i][j] पर कुछ असाइन करने का प्रयास करें, उदाहरण के लिए,:

    if (!a[i]) a[i] = [] 
    

    अंग्रेजी में ऊपर बयान में लिखा है: "अगर a की आई-वें तत्व 'falsy', आई-वें तत्व को एक खाली सरणी निर्दिष्ट करते हैं।"

  3. अंत में, 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)) 
2

यह

for (i=0; i<=2; i++) 

होना चाहिए:

for (i=0; i<=x_world_map_tiles ; i++) 
+2

नहीं, यह '(i = 0; i

+0

@ फ़ेलिक्सक्लिंग देखें '' (i = 0; i <= x_world_map_tiles; i ++) // नीचे बस एक टेस्ट '। – Engineer

+0

ठीक है, सहमत है, यह काम करेगा, लेकिन यह वास्तव में भी गलत है;) –

2
var x_world_map_tiles = 100; 
var y_world_map_tiles = 100; 
var world_map_array = new Array(x_world_map_tiles); 
for (i=0; i<=2; i++)//create a two dimensional array 
{ 
    world_map_array[i]=new Array(y_world_map_tiles); 
} 
for (i=0; i<x_world_map_tiles; i++) 
{ 
    for (z=0; z<y_world_map_tiles; z++) 
    { 
     world_map_array[i][z]="grass.gif|ongrass.gif|collision.gif|above.gif"; 
    } 
} 

अपने सरणी 100 की लंबाई है के रूप में, आप 100 को 99 (< 100) और नहीं करने के लिए 0 से जाना चाहिए (< =)

0

आप world_map_array[i] अभिव्यक्ति को i के लिए मान मान रहे हैं जोमें मौजूद नहीं हैworld_map_array। तो मुझे लगता है कि x_world_map_titles है> 2.

मैं तुम्हें फिर से लिखने i<=2i<=x_world_map_titles

इसके अलावा करने के लिए आप सरणी के आकार को निर्दिष्ट करने की जरूरत नहीं है की जरूरत है। मैं तो बस इस मामले में शाब्दिक का प्रयोग करेंगे:

जावास्क्रिप्ट में
var x_world_map_tiles = 100; 
var y_world_map_tiles = 100; 

var world_map_array = []; 
for (i=0; i<=x_world_map_tiles; i++) 
    //create a two dimensional array of 101x101 so can access the map through x and y coords map_array[0][1] etc. { 
    world_map_array[i]=[]; 
} 

for (i=0; i<=x_world_map_tiles; i++)//just a test { 
    for (z=0; z<=y_world_map_tiles; z++)//just a test { 
    world_map_array[i][z]="grass.gif|ongrass.gif|collision.gif|above.gif"; 
    } 
} 
संबंधित मुद्दे