2011-01-19 60 views
0

我想將一些數據傳遞給一個函數,該函數使用這些參數作爲多維數組的標識符,然後將硬編碼的值返回給該數組。我不確定我做錯了什麼,但有些事情正在破裂。Javascript函數和數組問題

我可以得到一個alert()在我分配任何數組值之前彈出,但它似乎在那一刻死亡。任何幫助表示讚賞。

// 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 2011-01-19 23:14:59

+0

a1 =「1」 b1 =「2」 a_status和b_status =「ok」 – 2011-01-19 23:17:04

+0

和for數組中,那些'o被替換爲1/0,編輯帖子以反映這一點。 – 2011-01-19 23:17:44

回答

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'; 

更新:如果你真的想有一個數字陣列,提供的密鑰是數字而已,你可以像這樣創建陣列:

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開始索引,結構會變得相當混亂。

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,this_array['1'],this_array['1']['1']this_array['1']['1']['o'],才能分配到this_array['1']['1']['o']['1']
  3. 您的this_function函數將在每次調用它時創建一個新的數組。這看起來效率很低。
  4. JavaScript數組並不是真正的數組,它們只是具有一些特殊功能的對象。考慮到並非所有的鍵都是數字的,你可能只想要對象。但是,如果你真的想要數組,他們通常以索引0而不是1開頭。
  5. 你非常正確的說數組索引真的是字符串,但他們幾乎總是寫成數字,這樣做完全沒問題(留下引號)。使用引號(這又是技術上正確的)將會使試圖維護代碼的人感到困惑。 (但是如果你使用的是對象而不是數組,它將主要起到幫助作用。)
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"; 

我試圖安慰了這個結果,一切都想出了爲未定義,但在陣列內至少並沒有死。

1

首先,在Javascript中沒有array()函數。我不知道這是否是指你的代碼的一些其他的點,而是通過數組構造new Array()或數組文本[]

您使用其次的是不是一個真正的數字的索引陣列創建陣列。

對於賦值部分:您有一個數組/對象,但深層嵌套的對象/數組是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]; 
}