如何动态使用访问数组?

时间:2012-04-03 17:25:03

标签: javascript arrays

我正在使用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];
}

我会有很多不同类型的数组,而不仅仅是两种。我会有很多功能。

那么,我该如何动态访问这些数组?

6 个答案:

答案 0 :(得分: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);
}

这是有效的,因为所有全局变量都是窗口对象的隐式属性。

答案 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

行动中:http://repl.it/CJQ

答案 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);
};