2012-04-11 61 views
1

我試圖在一個javascript語句中定義一個數組(包括其他數組作爲值),我可以通過循環來驗證提交時的表單。在javascript中創建多維數組,在自定義函數中出錯

我寫的函數(嘗試)創建內嵌數組如下:

function arr(){ 
    var inc; 
    var tempa = new Array(Math.round(arguments.length/2)); 
    for(inc=0; inc<arguments.length; inc=inc+2) { 
     tempa[arguments[inc]]=arguments[inc+1]; 
    } 
    return tempa; 
} 

這就是所謂的在這裏三次分配的數組:在JavaScript調試器中的可變

window.validArr = arr(
    'f-county',arr('maxlen',10, 'minlen',1), 
    'f-postcode',arr('maxlen',8, 'minlen',6) 
); 

然而是空的,並且arr()函數沒有返回任何東西。有誰知道爲什麼我對這個代碼應該做的期望不正確?

我已經制定了如何沒有這個功能創建磁盤陣列,但我很好奇爲什麼這個代碼不工作(我想我明白了JavaScript的比這更好)。)

回答

2

那麼從你的代碼的作用來看,你並不是真的在創建數組。在JavaScript中,使數組特殊的事情是管理數字索引的屬性。否則,他們只是對象,使他們能夠有其他屬性也一樣,但如果你不使用數組作爲數組,你可能也只是使用對象:

function arr(){ 
    var inc; 
    var tempa = {}; 
    for(inc=0; inc<arguments.length; inc=inc+2) { 
     tempa[arguments[inc]]=arguments[inc+1]; 
    } 
    return tempa; 
} 

你看到的從調試器是它試圖向你展示你的數組是一個真正的數組,應該顯示出來:也就是說,它的數字索引屬性。如果您按照原樣調用您的「arr()」函數,然後查看(從您的示例中)結果的「f-county」屬性,您會看到有些東西。

此外,如果你發現自己想要一個真正的數組,它們在初始化到一個特定的大小是絕對沒有意義的。只需創建一個新的陣列與[]

var tempa = []; 
+0

我已經習慣了PHP數組,這是我經常使用靈活地鍵值對相關聯,所以試圖在JS來模擬此。謝謝! – 2012-04-11 14:28:16

+1

是的,這是混淆的一個常見原因,並且它沒有因爲JavaScript對數組對象的普通字符串命名屬性完全正常而變得更好:-) – Pointy 2012-04-11 14:38:33

1

您的代碼的作品。只要檢查你的變量,你會看到數組上有自定義鍵。如果沒有擴展,你的調試器會以簡短的語法向你顯示(數字)指示值 - 你沒有。

但是,您可能需要了解數組和對象之間的區別。對象只是鍵值對(可以稱之爲「地圖」)及其原型。數組是一種特殊類型的對象。它具有特殊的原型方法,一個length功能和一個不同的方法:存儲索引值對(即使索引仍然是鍵)。所以,you shouldn't use an Array as an associative array

因此,他們的文字語法不同:

var array = ["indexed with key 0", "indexed with key 1", ...]; 
var object = {"custom":"keyed as 'custom'", "another":"string", ...}; 
// but you still can add keys to array objects: 
array.custom = "keyed as 'custom'"; 
+0

+1感謝此。這篇文章非常有意義。 – 2012-04-11 16:14:54

+0

...但你忘了點擊向上箭頭? – Bergi 2012-04-11 17:30:45

+0

需要15的代表得分答案。我已經做出了一個精神的筆記,當我可以的時候回來! – 2012-04-12 09:06:12