2012-04-03 5 views
0

Ich benutze jQuery 1.7.1 (aber das ist wahrscheinlich irrelevant).Wie verwendet man Zugriffs-Arrays dynamisch?

Ich habe mehrere JavaScript-Arrays, die auf verschiedene Arten bevölkert sind. Die Arrays, im Grunde wie folgt aussehen:

var TreeArray = [0,1,2]; 
var FruitArray = [4,5,6,7]; 

ich einige Links haben, die einen Elementtyp und eine Artikel-ID haben:

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

Wenn der Link angeklickt wird, wird die ItemType und ItemID werden gesammelt und an die Funktion addToArray() übergeben:

$Links.click(function(e) { 
    e.preventDefault(); 
    var ItemType = $(this).data("itemtype"); 
    var ItemID = $(this).data("itemid"); 
    addToArray(ItemType, ItemID); 
}); 

Hier ist das Problem. Wenn der ItemType "Tree" ist, möchte ich die ItemID in das TreeArray einfügen. Wenn der ItemType "Fruit" ist, möchte ich die ItemID in das FruitArray schreiben. Hier ist meine Funktion (das nicht funktioniert):

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

Ich werde ziemlich viele verschiedene Arten von Arrays, nicht nur zwei. Ich werde einige Funktionen haben.

Also, wie kann ich dynamisch auf diese Arrays zugreifen?

+0

"das funktioniert nicht" - Warum funktioniert es nicht? – ninjagecko

+1

'data = itemid = '123'' sollte es nicht' data-itemid =' 123'' sein? – wong2

+0

nicht, dass es die Quelle des Fehlers ist, aber 'WhichArray.push [ItemID];' sollte 'WhichArray.push (ItemID);' sein. – jbabey

Antwort

3

Ihre Arrays ändern Eigenschaften eines Objekts zu sein, und dann kann man sie mit Namen dynamisch zugreifen:

var arrays = { 
    Tree: [0,1,2], 
    Fruit: [4,5,6,7] 
}; 

var addToArray = function addToArray(ItemType, ItemID) { 
    arrays[ItemType].push(ItemID); 
} 

Als Alternative, wenn TreeArray und FruitArray globale Variablen waren, können Sie auch auf sie zugreifen können aus dem window Objekt wie dies ohne die Array-Definitionen zu ändern, obwohl ich lieber die erste Implementierung oben:

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

Dies funktioniert, weil alle globalen Variablen implizit Eigenschaften des Fensterobjekts sind.

+0

Ihr Beispiel funktioniert nicht für mich, aber es ist nah dran. Ich ändere Arrays [ItemType] .Push [ItemID] auf diese Arrays [ItemType] .Push (ItemID) und es funktioniert gut. –

+0

@EvikJames - Ja, das war ein Tippfehler. Ich habe es behoben. Ich bin froh, dass du es herausgefunden hast. Ich habe das falsche Bracing auf '.push()' von deiner Frage kopiert. – jfriend00

+0

Der obere Teil Ihrer Antwort funktionierte wie ein Zauber. Ich wusste, dass da draußen eine großartige Antwort für mich war. Vielen Dank! –

1

„Ich werde ziemlich viele verschiedene Arten von Arrays, nicht nur zwei. Ich werde schon einige Funktionen haben.

Also, wie kann ich diese Arrays dynamisch zugreifen?“

Normalerweise bedeutet dies, dass die Antwort ein Array-of-arrays oder ein array-of-arrays ist, aus denen Sie die Referenz extrahieren; Dies scheint ähnlich zu dem, was Sie mit var WhichArray = ItemType + "Array" zu tun versuchen.

Sie bauen diesen Super-Container automatisch auf, wenn Sie Ihre Arrays erstellen, oder indem Sie allen Arrays die gleiche Klasse geben und getElementsByClassName oder ähnliche Alternativen tun.

Zum Beispiel könnten Sie gerade tun:

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

Dies alles ist der Code Sie benötigen, total.

1

Sie könnten Ihre Arrays in einem Objekt platzieren und auf sie zugreifen mit []:

var myObj = { 
    TreeArray: [0,1,2], 
    FruitArray: [4,5,6,7] 
}; 

var selector = 'Tree'; 

// Access the array 
console.log(myObj[selector + 'Array'][2]); // 2 

In Aktion: http://repl.it/CJQ

+1

Der obere Teil Ihrer Antwort war nahe an meiner endgültigen Antwort. Vielen Dank! –

1

Warum ein Objekt mit den verschiedenen Elementtypen nicht Taste nach oben?

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

Sie hatten die richtige Idee. Vielen Dank! –

1

var WhichArray = ItemType + "Array";

WhichArray wird ein String, nicht das Array, das Sie wollten sein.

könnten Sie: var WhichArray = window[ItemType + "Array"]; statt

+0

Dies ist nicht die Antwort, die ich suchte, aber es war sehr hilfreich. Vielen Dank! –

1

Sie haben grundsätzlich zwei Möglichkeiten:

1) if-Anweisung (oder Schalter Fall, wenn Sie bevorzugen):

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) speichern die Arrays in einer Art von Datenstruktur (ein Array oder Objekt):

var arrays = { 
    Tree: [0,1,2], 
    Fruit: [4,5,6,7] 
}; 

var addToArray = function addToArray(ItemType, ItemID) { 
    arrays[ItemType].push(ItemID); 
}; 
+0

Ihre erste Idee ist schrecklich. Genau das möchte ich vermeiden. Ihre zweite Idee trifft den Nagel auf den Kopf. –

+0

@EvikJames ich stimme zu, die if-Anweisung ist überhaupt nicht erweiterbar. – jbabey