2012-04-03 77 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