2011-02-08 6 views
0

Представьте себе следующую ситуацию:Есть ли способ безопасно ссылаться на многомерные массивы Javascript?

var array = new Array ([0,0,0,0], [0,0,1,0], [0,0,0,0]); 
var x = 0; var y = 0; 
if(array[y][x]) { 
// x and y can be any integer 
// code should execute only for array[1][2] 
} 

Когда x и y сослаться на элемент в массиве, который существует, все нормально. В противном случае сценарий завершается. Очевидно, это не то поведение, которое я хочу - можно ли безопасно ссылаться на многомерные массивы Javascript?

+0

Если вы хотите безопасно работать с вашим массивом, вы должны проверить размеры массива в инструкции if и затем использовать его. – Eduard

+1

Вы не имеете в виду, что код должен выполняться только для 'array [1] [2]'? – user113716

+0

@patrick: спасибо, отредактирован. Вы получили суть, правда? Это всего лишь быстрый обобщенный пример :) –

ответ

1

Вы должны проверить, что упоминаемая свойство существует на каждом уровне массива:

if(array[y] && array[y][x]) { 
// x and y can be any integer 
// code should execute only for array[2][1] 
} 
+0

Но что, если array [y] == 1? –

+1

@ Эрик: тогда 'array [y] [x]' будет возвращать 'undefined', если не существует Number.prototype [x]: -p. Действительно, это до ФП и не связано с вопросом. –

+0

@ Эрик Микельсен: Ах, да. Я спал. И я просто удалил свой комментарий, прежде чем увидеть, что вы ответили на него. : - \ – Martijn

0

Вы можете использовать in ключевое слово, чтобы проверить, есть ли у-й элемент массива и является ли этот элемент имеет й-й элемент в качестве предварительной проверки:

if (y in array && x in array[y] && array[y][x]) {... 

Javascript массивы не так много многомерного как они являются составными/неровными. Вы также можете использовать Array.length, но он полагается на объект, являющийся массивом, который является частью того, что мы проверяем, поэтому он усложняет проверку.

+0

Я знаю, что массивы javascript не очень многомерны, но я пытался использовать язык, который помог бы другим с моей проблемой быстрее найти этот вопрос :) –

+0

@ Крис Браун: Я не хотел исправлять вас, а для иллюстрации трудности. –

0

Чуть более многословен, чем другие ответы:

var array = [ [0,0,0,0], [0,0,1,0], [0,0,0,0] ]; 
var x = 0; var y = 0; 
if(array.hasOwnProperty(y) && array[y].hasOwnProperty(x) && array[y][x] !== 0) { 
    // x and y can be any integer 
    // code should execute only for array[2][1] 
} 

... но это один непроницаем для дополнения к Array.prototype.

Кроме того, явное тестирование равенства с нулем делает его более читаемым, ИМХО. (Компенсирование для пониженной читаемости предыдущих условий ...: -P)