2013-08-13 3 views
0

У меня возникли проблемы с параметром массива объектов для функции.Функция не видит параметр как массив объектов

РЕАЛЬНЫЕ КОДЫ:

function drawTable(x,y,numero,t,e) { 

    context.fillStyle = "#ffff66"; 
    context.fillRect(x*146,y*146,55,55); 


    var color; 

    if (e[numero].tocado == "rojo") { 
     color = "#cc3300" 
    } else if (e[numero].tocado == "azul") { 
     color = "#0099ff"; 
    } else { 
     color = "#66ff66"; 
    } 

    context.fillStyle = color; 
    if (t==0 && x < 4) { 
     context.fillRect((x*146)+55,(y*146)+9,91,39); 
    } 
    if (t==1){ 
     context.fillRect((x*146)+9,(y*146)+55,39,91); 
    } 

    if (x==4) { 
     if (y<4) { 
      if (t==1) { 
       drawTable(0,y+1,numero+1,0,e); 
      } else { 
       drawTable(0,y,numero,1,e); 
      } 
     } 
    } else { 
     drawTable(x+1,y,numero+1,t,e); 
    } 
    return;  
} 

socket.on("start", function (data) { 
    game = data; 
    drawTable(0,0,0,0,game.elements); 
    //.... 
} 
"Data is a object:" 
function Game() { 
    this.turno = ""; 
    this.puntuacion_rojo = 0; 
    this.puntuacion_azul = 0; 
    this.elements = []; 
} 

"elements built" 
this.elements.push({ 
     id: 
     tipo: 
     tocado: , 
     left: 
     top: 
     width: 
     height: 
     }); 

Ошибка является:

Uncaught TypeError: Cannot read property 'tocado' of undefined.

в строке

if (e[numero].tocado == "rojo") { 

данных не пуст, я проверил его, он возвращается с сервера правильно.

+5

Используйте 'var e = [{}];'. В противном случае это не массив (так что вы не можете получить доступ к 0-му элементу) и не имеет в нем никаких объектов (поэтому вы не можете установить какое-либо свойство 'hello') – Ian

+3

' e' '' undefined' not a массив объектов (вы никогда не назначали значение 'e'). Почему вы * думаете, что JS должен думать, что это массив объектов? –

+0

Ну, авто-вивификация не в списке функций JS, но это могло быть.)) Что мне действительно интересно, почему этот подход (работа с массивом объектов) даже необходим здесь. – raina77ow

ответ

3

So, the problem is that "cosa" "thinks" e isnt a array of objects

Вы ошибаетесь. cosa даже не называется. Поток останавливается, когда вызывается неперехваченное исключение. Поскольку e не определен, вы получите исключение в этой строке:

e[0].hello = "hello!"; 

Если вы хотите получить доступ к e[0], e должен быть массивом:

var e = []; 

и если вы хотите получить доступ к e[0].hello, e[0] должен быть объектом:

var e = []; 
e[0] = {}; 
e[0].hello = "hello!": 

Или все это в одной строке:

var e = [{hello: "hello!"}]; 
+0

или 'e [0] [" hello "] =" hello "' – fusio

+0

Проблема в том, что мой var является частью «данных» var, поступающих на сервер, поэтому у меня есть массив объектов в составе «данных ». – grivcon

+1

@ user2657856: Вы даже ничего не делаете с 'data' в вашем примере кода. Если вы упростите свой код настолько, чтобы он менял проблему, не удивляйтесь, что вы получаете (может быть) бесполезные ответы. –

0

Это звучит как data.elements является пустым массивом, так e[0] возвращает неопределенный. Возможно, вы хотели поставить эту линию this.elements.push(…) внутри функции игры?

+0

Я тестировал объявление: var a = data.elements [0], is was empty, имеет некоторое значение, также установлены data.elements [0] .tocado. – grivcon

Смежные вопросы