Javascript 如何动态使用访问阵列?
我使用的是jQuery1.7.1(但这可能无关紧要) 我有几个JavaScript数组,它们以多种方式填充。阵列基本上如下所示:Javascript 如何动态使用访问阵列?,javascript,arrays,Javascript,Arrays,我使用的是jQuery1.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'
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是“Tree”,我想把ItemID放在TreeArray中。如果ItemType是“Fruit”,我想把ItemID放在水果数组中。这是我的函数(不起作用):
我将有很多不同类型的数组,而不仅仅是两种。我将有相当多的功能
那么,如何动态访问这些阵列呢
“我将拥有多种不同类型的数组,而不仅仅是两种。我将拥有多种功能
那么,如何动态访问这些阵列?”
通常这意味着答案是有一个数组数组,或者一个数组对象,从中提取引用;这似乎类似于您尝试使用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);
};
});
这是您需要的全部代码。,总计。将数组更改为对象的属性,然后您可以按名称动态访问它们:
var arrays = {
Tree: [0,1,2],
Fruit: [4,5,6,7]
};
var addToArray = function addToArray(ItemType, ItemID) {
arrays[ItemType].push(ItemID);
}
另一种选择是,如果
trearray
和furtarray
是全局变量,您也可以像这样从窗口
对象访问它们,而不更改数组定义,尽管我更喜欢上面的第一种实现:
// 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);
}
这是因为所有全局变量都是窗口对象的隐式属性。您可以将数组放置在对象中,并使用
[]
访问它们:
var myObj = {
TreeArray: [0,1,2],
FruitArray: [4,5,6,7]
};
var selector = 'Tree';
// Access the array
console.log(myObj[selector + 'Array'][2]); // 2
在操作中:为什么不为具有不同项目类型的对象设置关键帧
var lists = {
Tree: [0,1,2],
Fruit: [4,5,6,7]
}
var addToArray = function addToArray(ItemType, ItemID) {
var WhichArray = lists[ItemType];
WhichArray.push[ItemID];
}
var WhichArray=ItemType+“Array”代码>
WhichArray将是一个字符串,而不是您想要的数组
您可以使用:var WhichArray=window[ItemType+“Array”]代码>相反,您基本上有两种选择:
1) if语句(或开关盒,如果您愿意):
2) 将数组存储在某种类型的数据结构(数组或对象)中:
“那不起作用”-为什么不起作用?data=itemid='123'
它不应该是data itemid='123'
?不是它是错误的来源,而是WhichArray.push[itemid]代码>应该是WhichArray.push(ItemID)你的第一个想法很糟糕。这正是我想要避免的。你的第二个想法一针见血。@EvikJames我同意,if语句根本不可扩展。这不是我想要的答案,但它非常有用。谢谢你的例子不适合我,但很接近。我将数组[ItemType].push[ItemID]更改为数组[ItemType].push(ItemID),效果很好。@EvikJames-是的,这是一个打字错误。我已经修好了。很高兴你明白了。实际上,我从你的问题中复制了.push()
上的错误支撑。你答案的顶部很有魅力。我知道有一个很好的答案。谢谢你答案的上半部分接近我的最终答案。谢谢
var myObj = {
TreeArray: [0,1,2],
FruitArray: [4,5,6,7]
};
var selector = 'Tree';
// Access the array
console.log(myObj[selector + 'Array'][2]); // 2
var lists = {
Tree: [0,1,2],
Fruit: [4,5,6,7]
}
var addToArray = function addToArray(ItemType, ItemID) {
var WhichArray = lists[ItemType];
WhichArray.push[ItemID];
}
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);
}
};
var arrays = {
Tree: [0,1,2],
Fruit: [4,5,6,7]
};
var addToArray = function addToArray(ItemType, ItemID) {
arrays[ItemType].push(ItemID);
};