2012-04-03 59 views
0

我正在使用jQuery 1.7.1(但這可能無關緊要)。如何動態使用訪問數組?

我有幾種JavaScript數組,填充方式有幾種。這些陣列,基本上是這樣的:

var TreeArray = [0,1,2]; 
var FruitArray = [4,5,6,7]; 

我有一些鏈接,有一個項目類型和項目編號:

<a href='?' class='Link' data-itemid='123' data-itemtype='Tree'>elm</a> 
<a href='?' class='Link' data-itemid='789' data-itemtype='Tree'>walnut</a> 
<a href='?' class='Link' data-itemid='456' data-itemtype='Fruit'>orange</a> 
<a href='?' class='Link' data-itemid='111' data-itemtype='Fruit'>apple</a> 

當用戶點擊該鏈接時,的ItemType和項目ID被收集和傳遞給addToArray()函數:

$Links.click(function(e) { 
    e.preventDefault(); 
    var ItemType = $(this).data("itemtype"); 
    var ItemID = $(this).data("itemid"); 
    addToArray(ItemType, ItemID); 
}); 

這裏是問題所在。如果ItemType是「Tree」,我想把ItemID放在TreeArray中。如果ItemType是「水果」,我想把ItemID放在FruitArray中。這裏是我的功能(即不工作):

var addToArray = function addToArray(ItemType, ItemID) { 
    var WhichArray = ItemType + "Array"; 
    WhichArray.push[ItemID]; 
} 

我將有很多不同類型的數組,而不是兩個。我會有很多功能。

那麼,我該如何動態訪問這些數組呢?

+0

「不起作用」 - 爲什麼它不工作? – ninjagecko 2012-04-03 17:26:24

+1

'data = itemid ='123''不應該是'data-itemid ='123''? – wong2 2012-04-03 17:28:28

+0

不是它是錯誤的來源,而是'WhichArray.push [ItemID];'應該是'WhichArray.push(ItemID);'。 – jbabey 2012-04-03 17:38:20

回答

3

改變你的陣列是一個對象的屬性,然後您可以通過名稱動態地訪問它們:

var arrays = { 
    Tree: [0,1,2], 
    Fruit: [4,5,6,7] 
}; 

var addToArray = function addToArray(ItemType, ItemID) { 
    arrays[ItemType].push(ItemID); 
} 

作爲替代,如果TreeArrayFruitArray是全局變量,你也可以訪問它們斷window對象像這樣在不改變所述陣列的定義,雖然我更喜歡上面的第一個實施:

// global variables 
var TreeArray = [0,1,2]; 
var FruitArray = [4,5,6,7]; 

var addToArray = function addToArray(ItemType, ItemID) { 
    var WhichArray = ItemType + "Array"; 
    window[WhichArray].push(ItemID); 
} 

這適用,因爲所有全局變量都是窗口對象的隱式屬性。

+0

你的例子對我來說不起作用,但它很接近。我將數組[ItemType] .push [ItemID]更改爲這個數組[ItemType] .push(ItemID),它運行良好。 – 2012-04-03 17:57:45

+0

@EvikJames - 是的,那是一個錯字。我修復了它。很高興你想出來了。我實際上從你的問題中拷貝了'.push()'上的錯誤支撐。 – jfriend00 2012-04-03 17:58:20

+0

答案的頂部就像一個魅力。我知道我有一個很好的答案。謝謝! – 2012-04-07 21:30:24

1

「我有好幾個不同類型的數組,而不是兩個。我將有相當多的功能。

所以,我怎麼能動態地訪問這些陣列?」

通常這意味着答案是有一個數組的陣列或從中提取引用的數組對象;這似乎與你想要用var WhichArray = ItemType + "Array"做什麼相似。

您可以在創建陣列時自動構建超級容器,也可以通過爲所有陣列提供相同的類並執行getElementsByClassName或其他類似的替代方法。

例如,你可以只是做:

var clicked = {}; // looks like {Tree:[123, 789], Fruit:[...]} 

// For each clickable link... 
document.getElementsByClassName('Link').forEach(function(link) { 
    // ... add a callback which says... 
    link.onclick = function(this) { 
     // ... to take the itemtype and itemid... 
     var itemType = link.getAttribute('data-itemtype'); 
     var itemId = link.getAttribute('data-itemid'); 

     // ... and add it to our master dictionary 
     if (clicked[itemType]===undefined) 
      clicked[itemType] = []; 
     clicked[itemType].push(itemId); 
    }; 
}); 

這是所有的代碼,你需要,總。

1

您可以將您的陣列中的對象,並與[]訪問它們:

var myObj = { 
    TreeArray: [0,1,2], 
    FruitArray: [4,5,6,7] 
}; 

var selector = 'Tree'; 

// Access the array 
console.log(myObj[selector + 'Array'][2]); // 2 

在行動:http://repl.it/CJQ

+1

你答案的最上面部分接近我的最終答案。謝謝! – 2012-04-07 21:31:08

1

爲什麼不鍵上的不同項目類型的對象?

var lists = { 
    Tree: [0,1,2], 
    Fruit: [4,5,6,7] 
} 

var addToArray = function addToArray(ItemType, ItemID) { 
    var WhichArray = lists[ItemType]; 
    WhichArray.push[ItemID]; 
} 
+0

你有正確的想法。謝謝! – 2012-04-07 21:31:31

1

var WhichArray = ItemType + "Array";

WhichArray將是一個字符串,而不是你想要的陣列。

你可以使用:var WhichArray = window[ItemType + "Array"];代替

+0

這不是我正在尋找的答案,但它非常有幫助。謝謝! – 2012-04-03 17:39:24

1

你基本上有兩種選擇:

1)if語句(或交換機的情況下,如果你喜歡):

var addToArray = function addToArray(ItemType, ItemID) { 
    if (ItemType === 'Tree') { 
     TreeArray.push(itemID); // notice push is a function, don't call with []... 
    } else { 
     FruitArray.push(itemID); 
    } 
}; 

2)存儲陣列在某些類型的數據結構(數組或對象)中:

var arrays = { 
    Tree: [0,1,2], 
    Fruit: [4,5,6,7] 
}; 

var addToArray = function addToArray(ItemType, ItemID) { 
    arrays[ItemType].push(ItemID); 
}; 
+0

你的第一個想法很糟糕。這正是我想要避免的。你的第二個想法擊中了頭部。 – 2012-04-03 17:36:47

+0

@EvikJames我同意,if語句根本不可擴展。 – jbabey 2012-04-03 17:37:30