2012-04-03 4 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 и ItemID собраны и передан функции 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 - «Fruit», я хочу поместить ItemID в FruitArray. Вот моя функция (которая не работает):

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

у меня будет довольно много различных типов массивов, а не только два. У меня будет довольно много функций.

Итак, как я могу получить доступ к этим массивам динамически?

+0

«что не работает» - почему это не работает? – ninjagecko

+1

'data = itemid = '123'' не должно быть' data-itemid =' 123''? – wong2

+0

не то, что он является источником ошибки, но 'WhatArray.push [ItemID];' должен быть 'WhatArray.push (ItemID);'. – jbabey

ответ

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

Это работает, потому что все глобальные переменные являются неявно свойствами объекта window.

+0

Ваш пример не работает для меня, но он близок. Я изменяю массивы [ItemType] .push [ItemID] для этого массива [ItemType] .push (ItemID), и он работает хорошо. –

+0

@ EvikJames - Да, это была опечатка. Я исправил это. Рад, что ты это понял. Я на самом деле скопировал эту неправильную привязку на '.push()' из вашего вопроса. – jfriend00

+0

Верхняя часть вашего ответа работала как шарм. Я знал, что для меня был отличный ответ. Благодаря! –

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

Верхняя часть вашего ответа была близка к моему окончательному ответу. Благодаря! –

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

У вас была правильная идея. Благодаря! –

1

var WhichArray = ItemType + "Array";

WhichArray будет строка, а не массив вы хотите.

вы могли бы использовать: var WhichArray = window[ItemType + "Array"]; вместо

+0

Это не тот ответ, который я искал, но это было очень полезно. Благодаря! –

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); 
}; 
+0

Вы первая идея ужасная. Именно этого я и хочу избежать. Ваша вторая идея поражает гвоздь на голове. –

+0

@EvikJames Я согласен, оператор if вообще не расширяем. – jbabey

Смежные вопросы