我正在使用jQuery 1.7.1(但这可能无关紧要)。
我有几个以多种方式填充的JavaScript数组。基本上,数组看起来像这样:
var TreeArray = [0,1,2];
var FruitArray = [4,5,6,7];
我有一些包含商品类型和商品ID的链接:
<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和ItemID并将其传递给addToArray()函数:
$Links.click(function(e) {
e.preventDefault();
var ItemType = $(this).data("itemtype");
var ItemID = $(this).data("itemid");
addToArray(ItemType, ItemID);
});
问题出在哪里。如果ItemType是&#34; Tree&#34;,我想将ItemID放在TreeArray中。如果ItemType是&#34; Fruit&#34;,我想把ItemID放在FruitArray中。这是我的功能(不起作用):
var addToArray = function addToArray(ItemType, ItemID) {
var WhichArray = ItemType + "Array";
WhichArray.push[ItemID];
}
我会有很多不同类型的数组,而不仅仅是两种。我会有很多功能。
那么,我该如何动态访问这些数组?
答案 0 :(得分:3)
将数组更改为对象的属性,然后您可以按名称动态访问它们:
var arrays = {
Tree: [0,1,2],
Fruit: [4,5,6,7]
};
var addToArray = function addToArray(ItemType, ItemID) {
arrays[ItemType].push(ItemID);
}
作为替代方案,如果TreeArray
和FruitArray
是全局变量,您也可以在不更改数组定义的情况下从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);
}
这是有效的,因为所有全局变量都是窗口对象的隐式属性。
答案 1 :(得分: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);
};
});
这是您需要的所有代码,总计。
答案 2 :(得分: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
答案 3 :(得分: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];
}
答案 4 :(得分:1)
var WhichArray = ItemType + "Array";
WhichArray将是一个字符串,而不是您想要的数组。
您可以使用:var WhichArray = window[ItemType + "Array"];
代替
答案 5 :(得分:1)
您基本上有两个选择:
1)如果声明(或转换案例,如果您愿意):
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);
};