2011-01-19 4 views
0

Я пытаюсь передать некоторые данные функции, которая использует эти аргументы как идентификаторы для многомерного массива, а затем возвращает значение, жестко закодированное в этот массив. Я не уверен, что я делаю неправильно, но что-то ломается.Javascript function and array problem

Я могу получить предупреждение(), чтобы пометить, прежде чем назначать значения массива, но, похоже, он умирает в этот момент. Любая помощь приветствуется.

// Get Column A's number 
var a1 = Number($('#p-a').attr("numb")); 

// Get Column B's number 
var b1 = Number($('#p-b').attr("numb")); 

// Get status for column A 
var a_status = $('#p-a').attr("status"); 

// Get status for column A 
var b_status = $('#p-b').attr("status"); 

// If same, status="s" else, status="i" 
var status = ""; 
if(a_status == b_status) { status = "s"; }else{ status = "o"; } 

// Get the value of the numbers + status 
var a = this_function(a1, b1, status, "2"); 

// Update the status div 
$('#status').html(a); 

function this_function(a1, a2, s, p) 
{ 
    this_array = array(); 
    this_array['1']['1']['1']['1'] = "10"; 
    this_array['1']['1']['1']['2'] = "20"; 
    this_array['1']['2']['1']['1'] = "40"; 
    this_array['1']['2']['1']['2'] = "60"; 
    // 
    return this_array[a1][a2][s][p]; 
} 
+2

что делает возвращающий массив? Кроме того, это не похоже на массив для меня, поскольку он использует букву 'o' в качестве индекса вместо 0 – glebm

+0

a1 =" 1 " b1 =" 2 " a_status и b_status =" ok " –

+0

и для массив, эти «o» были заменены на 1/0, отредактировав сообщение, чтобы отразить это. –

ответ

5

Вы не можете инициализировать такие массивы. Каждый уровень необходимо инициализировать индивидуально. И как вы не только числовые ключи, я бы использовать вместо object:

var this_array = { 
    '1': { 
     '1': { 
      'o': { 
       '1': "10", 
       '2': "20" 
      } 
     }, 
     '2': { 
      'o': { 
       '1': "40", 
       '2': "60" 
      } 
     } 
    } 
}; 

Вы бы также должны определить, что произойдет, если ключ не существует. Например. в настоящее время, если status - 's', то вы получите сообщение об ошибке.


if утверждения можно записать короче с помощью conditional operator:

var status = (a_status == b_status) ? 's' : 'o'; 

Update: Если вы действительно хотите иметь числовой массив, при условии, что ключи числовые только вы может создать такой массив:

var this_array = [ 
    [],      // this_array[0] 
    [       // this_array[1] 
     [],     // this_array[1][0] 
     [      // this_array[1][1] 
      [],    // this_array[1][1][0] 
      [null, 10, 20]  // this_array[1][1][1][...] 
     ], 
     [      // this_array[1][2] 
      [],    // this_array[1][2][0] 
      [null, 40, 60]  // this_array[1][2][1][...]     
     ] 
    ] 
]; 

Вы видите, если вы не запустите свои индексы с 0, структура становится довольно запутанной.

+0

Не уверен, почему я не комментировал, но это сработало отлично. Спасибо за помощь. –

+0

@David Houde: Добро пожаловать :) –

2

Неправильная запись вашего массива в пределах this_function (запрет на использование функции array, которая создает массив в форме, которую вы показываете). Примечания:

function this_function(a1, a2, s, p) 
{ 
    this_array = array(); // <== There is no `array` function in std. JavaScript 
    this_array['1']['1']['o']['1'] = "10"; // <== Unless you've created an object/array at this_array['1'] (which you haven't), this line will fail 
    this_array['1']['1']['o']['2'] = "20"; 
    this_array['1']['2']['o']['1'] = "40"; 
    this_array['1']['2']['o']['2'] = "60"; 
    // 
    return this_array[a1][a2][s][p]; 
} 

Я не совсем уверен, что this_function должен делать, или я бы предложил функцию замены. Некоторые мысли:

  1. Создание массива, можно использовать [] (или new Array(), но это только больше формы одного и того же).
  2. Вы должны создать каждый объект/массив в массиве. Таким образом, вы не можете назначить this_array['1']['1']['o']['1'], например, до создания объекта/массива по адресу this_array, this_array['1'], this_array['1']['1'] и this_array['1']['1']['o'].
  3. Функция this_function создаст массив каждый раз, когда он будет вызван. Это кажется крайне неэффективным.
  4. Массивы JavaScript на самом деле не массивы, они просто объекты с некоторыми специальными функциями. Вы можете просто хотеть объекты, учитывая, что не все ваши ключи являются числовыми. Однако, если вы действительно хотите массивы, они чаще всего начинаются с индекса 0, а не 1.
  5. Вы совершенно правы, что индексы массива - это действительно строки, но они почти всегда записываются как числа, и это совершенно нормально делать (оставляя кавычки). Использование котировок (что опять же технически корректно) будет сбивать с толку людей, пытающихся сохранить код. (Но если вы используете объекты, а не массивы, это в основном поможет.)
+0

Спасибо за помощь –

0

Я не разбираюсь в многомерных массивах, но вам нужно определить все свои внутренние массивы, прежде чем вы сможете их установить. что-то вроде этого:

var this_array = []; 
this_array['1'] = []; 
this_array['1']['1'] = []; 
this_array['1']['2'] = []; 
this_array['1']['1']['o'] = []; 
this_array['1']['2']['o'] = []; 

this_array['1']['1']['o']['1'] = "10"; 
this_array['1']['1']['o']['2'] = "20"; 
this_array['1']['2']['o']['1'] = "40"; 
this_array['1']['2']['o']['2'] = "60"; 

я попытался утешить этот результат, и все придумал, как не определено, но в массиве, по крайней мере, и не умер.

+0

Я бы не использовал массивы, подобные объектам. 'this_array ['1'] ['1'] ['o'] = [];' в какой-то момент даст вам проблемы. –

+0

ya, отправил это, прежде чем я увидел ваш ответ выше, который, я думаю, является лучшей альтернативой для javascript, и поэтому рекомендуется hh – hellatan

+0

Спасибо dtan, я ценю это –

1

Прежде всего нет функции array() в Javascript. Я не знаю, если это относится к какой-либо другой точке вашего кода, но массивы создаются с помощью конструктора массива new Array() или массив буквального []

Во-вторых, что вы используете не реальный numberical индексируется массив.

Для части назначения: у вас есть один массив/объект, но глубоко вложенные объекты/массивы - undefined.

Ваш код умирает от: this_array['1']['1']['o']['1'] = "10";, потому что this_array['1'] - undefined, у которого не может быть никакого имущества, чтобы цепь была сломана.

Тогда возникает проблема с типами. Вы преобразовываете атрибут в число на Number($('#p-a').attr("numb"));, а затем используете строки как индексы. Это связано с путаницей массива/объекта.

Что вам нужно, чтобы создать реальный массив, а также использовать числовые индексы:

// move it outside so you only 
// create this beast once 
var array = [ // first level 
    [   // second level 
    [   // third level 
     [10, 20] // fourth level 
    ], 
    [ 
     [40, 60] 
    ] 
    // , [...] 
    ] 
]; 

function this_function(a1, a2, s, p) { 
    return array[a1-1][a2-1][s-1][p-1]; 
}