Я описал это решение способом, который несколько менее эффективен, чем его можно было бы объяснить; более краткая версия легко выводится из того, что я здесь показал.
Сопоставьте значения -1, 0 и 1 с 0x00, 0x01 и 0x02 и сохраните их, используя 2 бита на значение, в 8-битном значении, например, так: значения вашего массива соответствуют следующим числам:
array[1][0]: binary value 01100100 = 0x64
array[1][1]: binary value 00011001 = 0x19
array[1][2]: binary value 01000110 = 0x46
array[1][3]: binary value 10010001 = 0x91
Создайте массив для всех 255 возможных значений, которые можно хранить в 8-битном значении (обратите внимание, что некоторые записи не будут использоваться, т.е. любые с обоими битами, установленными в 1 - это неэффективность, которую я упомянул).
Так, например
array[0] points to the appropriate array for -1, -1, -1, -1
array[1] points to the appropriate array for -1, -1, -1, 0
array[2] points to the appropriate array for -1, -1, -1, 1
array[3] points nowhere
array[4] points to the appropriate array for -1, -1, 0, -1
array[5] points to the appropriate array for -1, -1, 0, 0
array[6] points to the appropriate array for -1, -1, 0, 1
array[7] points nowhere
(etc, obviously)
И тогда все, что вам нужно, это один поиск без цикла, чтобы получить правильный массив (или то, к чему вы обращаетесь).
В более кратком решении в таблице нет записей, указывающих на никуда.
EDIT:
В этом случае с массивом, как указано выше, желаемая функция:
f(a,b,c,d) {
return array[(a+1) << 6 + (b+1) << 4 + (c+1) << 2 + (d+1)];
}