2010-11-22 7 views
168

erstellen Wie können Sie die JavaScript/JQuery Äquivalent dieses Java-Code erstellen:Wie eine einfache Karte mit JavaScript/JQuery

Map map = new HashMap(); //Doesn't not have to be a hash map, any key/value map is fine 
map.put(myKey1, myObj1); 
map.put(myKey2, myObj2); //Repeat n times 

function Object get(k) { 
    return map.get(k); 
} 

Antwort

263

Edit: Veraltete Antwort, ECMAScript 2015 (ES6) Standard Javascript hat ein Map Implementierung, lesen Sie hier für weitere Informationen: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

var map = new Object(); // or var map = {}; 
map[myKey1] = myObj1; 
map[myKey2] = myObj2; 

function get(k) { 
    return map[k]; 
} 

//map[myKey1] == get(myKey1); 
+10

Meine Antwort wurde aktualisiert, um ein 'new Object()' anstelle von 'new Array()' zu verwenden. Siehe [diesen Artikel] (http://andrewdupont.net/2006/05/18/javascript-associative-arrays-consided-harmful/) –

+0

Wie können wir hier einen Wurzelknoten bereitstellen? – Krishnan

+0

Wie können wir einen Schlüsselzahler von der Karte entfernen? –

60

Gerade einfache Objekte verwenden:

var map = { key1: "value1", key2: "value2" } 
function get(k){ 
    return map[k]; 
} 
+0

Die Tasten sollte nicht als Strings angegeben werden, dh ohne Anführungszeichen – lilalinux

13
var map = {'myKey1':myObj1, 'mykey2':myObj2}; 
// You don't need any get function, just use 
map['mykey1'] 
6

Wenn Sie nicht auf JQuery beschränkt sind, können Sie das Framework prototype.js verwenden. Es hat eine Klasse namens Hash: Sie können sogar JQuery & prototype.js zusammen verwenden. Tippen Sie einfach jQuery.noConflict();

var h = new Hash(); 
h.set("key", "value"); 
h.get("key"); 
h.keys(); // returns an array of keys 
h.values(); // returns an array of values 
23
function Map() { 
    this.keys = new Array(); 
    this.data = new Object(); 

    this.put = function (key, value) { 
     if (this.data[key] == null) { 
      this.keys.push(key); 
     } 
     this.data[key] = value; 
    }; 

    this.get = function (key) { 
     return this.data[key]; 
    }; 

    this.remove = function (key) { 
     this.keys.remove(key); 
     this.data[key] = null; 
    }; 

    this.each = function (fn) { 
     if (typeof fn != 'function') { 
      return; 
     } 
     var len = this.keys.length; 
     for (var i = 0; i < len; i++) { 
      var k = this.keys[i]; 
      fn(k, this.data[k], i); 
     } 
    }; 

    this.entrys = function() { 
     var len = this.keys.length; 
     var entrys = new Array(len); 
     for (var i = 0; i < len; i++) { 
      entrys[i] = { 
       key: this.keys[i], 
       value: this.data[i] 
      }; 
     } 
     return entrys; 
    }; 

    this.isEmpty = function() { 
     return this.keys.length == 0; 
    }; 

    this.size = function() { 
     return this.keys.length; 
    }; 
} 
+4

Mindestens alle diese Methoden auf den Prototyp. – Bergi

+0

@Bergi weil ...? – rgtk

+3

@Adshi: [Verwendung von 'Prototyp' vs. 'this' in Javascript?] (Https://stackoverflow.com/questions/310870/use-of-prototype-vs-this-in-javascript) – Bergi

18

Dies ist eine alte Frage, aber weil die vorhandenen Antworten sehr gefährlich sein könnten, wollte ich für zukünftig Leute diese Antwort lassen, die hier in stolpern könnten ...

Die Antworten, die auf der Verwendung eines Objekts als HashMap basieren, sind fehlerhaft und können äußerst unangenehme Folgen haben, wenn Sie etwas anderes als einen String als Schlüssel verwenden. Das Problem besteht darin, dass Objekteigenschaften mithilfe der .toString-Methode in Strings umgewandelt werden. Dies kann zu folgenden Gemeinheit führen:

function MyObject(name) { 
    this.name = name; 
}; 
var key1 = new MyObject("one"); 
var key2 = new MyObject("two"); 

var map = {}; 
map[key1] = 1; 
map[key2] = 2; 

Wenn Sie dieses Objekt erwartet wurden hier in der gleichen Weise wie ein Java Map verhalten würde, würden Sie eher verstimmt sein, dass Karte zu entdecken enthält nur ein Eintrag mit dem String key [object Object]:

> JSON.stringify(map); 
{"[object Object]": 2} 

Dies ist eindeutig nicht Ersatz für Java HashMap. Aufgrund seines Alters hat JavaScript derzeit kein allgemeines Kartenobjekt. Es gibt jedoch Hoffnung: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map Obwohl ein Blick auf die Browser Compatibility-Tabelle zeigt, dass diese noch nicht für allgemeine Web-Anwendungen geeignet ist.

In der Zwischenzeit das Beste, was Sie tun können, ist:

  • Absichtlich Strings als Schlüssel verwenden. I.e. Verwenden Sie explizite Zeichenfolgen als Schlüssel, anstatt sich auf die implizite .toString-Anweisung der von Ihnen verwendeten Schlüssel zu verlassen.
  • Stellen Sie sicher, dass die Objekte, die Sie als Schlüssel verwenden, über eine wohldefinierte .toString() -Methode verfügen, die Ihrem Verständnis der Eindeutigkeit dieser Objekte entspricht.
  • Wenn Sie die .toString-Eigenschaft der Schlüsselobjekte nicht ändern können/wollen, konvertieren Sie beim Speichern und Abrufen der Einträge die Objekte in eine Zeichenfolge, die Ihr Verständnis von Eindeutigkeit darstellt. Z.B. map[toUniqueString(key1)] = 1

Manchmal ist das jedoch nicht möglich. Wenn Sie Daten z. B. basierend auf Dateiobjekten zuordnen möchten, gibt es keine zuverlässige Möglichkeit, dies zu tun, da die Attribute, die das Dateiobjekt verfügbar macht, nicht ausreichen, um seine Eindeutigkeit sicherzustellen. (Sie können zwei Dateiobjekte haben, die verschiedene Dateien auf der Festplatte darstellen, aber es gibt keine Möglichkeit, sie in JS im Browser zu unterscheiden).In diesen Fällen ist es leider alles, was Sie tun können, Ihren Code zu refaktorieren, um die Notwendigkeit zu beseitigen, diese in einem Mai zu speichern. vielleicht, indem Sie stattdessen ein Array verwenden und diese ausschließlich nach Index referenzieren.

Verwandte Themen