2010-11-22 6 views

Répondre

263

Edit: Expiré réponse, ECMAScript 2015 (ES6) javascript standard a une la mise en œuvre de la carte, lire ici pour plus d'informations: 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

J'ai mis à jour ma réponse pour utiliser 'new Object()' au lieu de 'new Array()'. Voir [cet article] (http://andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/) –

+0

Comment pouvons-nous fournir un nœud racine ici? – Krishnan

+0

Comment pouvons-nous supprimer un payeur de valeur clé de la carte? –

60

Il suffit d'utiliser des objets simples:

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

Les clés ne devrait pas être spécifié comme des chaînes, c'est-à-dire sans guillemets – lilalinux

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

Si vous n'êtes pas limité à JQuery, vous pouvez utiliser le framework prototype.js. Il a une classe appelée Hash: Vous pouvez même utiliser JQuery & prototype.js ensemble. Tapez simplement 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

Au moins, mettez toutes ces méthodes sur le prototype. – Bergi

+0

@ Bergi parce que ...? – rgtk

+3

@Adshi: [Utilisation de 'prototype' vs 'ceci' en Javascript?] (Https://stackoverflow.com/questions/310870/use-of-prototype-vs-this-in-javascript) – Bergi

18

C'est une question ancienne, mais parce que les réponses existantes pourraient être très dangereux, je voulais laisser cette réponse pour les futurs gens qui pourraient trébucher ici ...

Le Les réponses basées sur l'utilisation d'un objet comme HashMap sont brisées et peuvent avoir des conséquences extrêmement désagréables si vous utilisez autre chose qu'une chaîne comme clé. Le problème est que les propriétés d'objet sont forcées dans les chaînes à l'aide de la méthode .toString. Cela peut conduire à la méchancetés suivante:

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

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

Si vous espériez que l'objet se comporterait de la même manière que Java Map ici, vous seriez plutôt vexé de découvrir cette carte ne contient que une entrée avec le la clé de l'[object Object]:

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

Ceci est clairement pas pour remplacer le HashMap de Java. Bizarrement, étant donné son âge, Javascript n'a actuellement pas d'objet de carte à usage général. Cependant, il y a de l'espoir à l'horizon: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map même si un coup d'œil sur la table de compatibilité du navigateur montre qu'il n'est pas encore prêt à être utilisé dans les applications Web générales.

En attendant, le meilleur que vous pouvez faire est:

  • utiliser Délibérément chaînes comme clés. C'est à dire. Utilisez des chaînes explicites en tant que clés plutôt que de vous fier à la chaîne .toString implicite des clés que vous utilisez.
  • Assurez-vous que les objets que vous utilisez en tant que clés ont une méthode .toString() bien définie qui convient à votre compréhension de l'unicité de ces objets.
  • Si vous ne pouvez pas/ne voulez pas modifier le .toChaîne des objets clés, lors du stockage et de la récupération des entrées, convertissez les objets en une chaîne qui représente votre compréhension de l'unicité. Par exemple. map[toUniqueString(key1)] = 1

Parfois, cependant, ce n'est pas possible. Si vous souhaitez mapper des données basées sur, par exemple, des objets Fichier, il n'existe aucun moyen fiable de le faire car les attributs que l'objet Fichier expose ne sont pas suffisants pour garantir son unicité. (Vous pouvez avoir deux objets File représentant différents fichiers sur le disque, mais il n'y a aucun moyen de les distinguer dans JS dans le navigateur).Dans ces cas, malheureusement, tout ce que vous pouvez faire est de refactoriser votre code pour éliminer le besoin de les stocker dans un may; peut-être, en utilisant un tableau à la place et en les référençant exclusivement par index.

Questions connexes