【问题标题】:How to create a simple map using JavaScript/JQuery [duplicate]如何使用 JavaScript/JQuery 创建一个简单的地图 [重复]
【发布时间】:2011-05-13 22:00:06
【问题描述】:

如何创建此 Java 代码的 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);
}

【问题讨论】:

    标签: javascript jquery hashmap


    【解决方案1】:

    编辑:过时的答案,ECMAScript 2015 (ES6) 标准 javascript 有一个 Map 实现,阅读这里了解更多信息: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);
    

    【讨论】:

    • 更新了我的答案以使用new Object() 而不是new Array()。见this article
    • 这里如何提供根节点?
    • 我们如何从地图中删除键值付款人?
    • @Shikha 最有效的方法就是放入 (key, null) 然后检查您的值是否为空。否则,检查如何删除数组中的项目(使用 javascript 函数拼接)
    • 这个答案现在已经过时了,因为 Map 现在确实存在(耶!),请阅读以下内容:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
    【解决方案2】:

    只使用普通对象:

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

    【讨论】:

    • 键不应指定为字符串,即不带引号
    【解决方案3】:
    var map = {'myKey1':myObj1, 'mykey2':myObj2};
    // You don't need any get function, just use
    map['mykey1']
    

    【讨论】:

    • 不管什么原因,我们也可以这样做:var myKey = "myKey1" 然后var map = { [myKey] : myObj1}
    【解决方案4】:

    如果你不局限于 JQuery,你可以使用prototype.js 框架。它有一个名为 Hash 的类:你甚至可以同时使用 JQuery 和 prototype.js。只需输入 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
    

    【讨论】:

      【解决方案5】:
      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;
          };
      }
      

      【讨论】:

      • 至少,把所有这些方法都放在原型上。
      • this.data[key] = null 不会删除该属性;它只是将其值设置为null。你应该改用delete this.data[key]
      • 在入口函数,你应该这样改变。条目[i] = { 键:this.keys[i],值:this.data[i] }; -> 条目[i] = { 键:this.keys[i],值:this.data[this.keys[i]] }; -
      • @YoYoYonnY:我不知道柯里化与此有什么关系,但原型方法也不会泄漏变量或具有可变范围。他们确实有一个后期绑定的this 上下文,但这是一个功能而不是问题。
      【解决方案6】:

      这是一个老问题,但由于现有的答案可能非常危险,我想把这个答案留给未来可能会在这里绊倒的人......

      基于使用 Object 作为 HashMap 的答案已被破坏,如果您使用 String 以外的任何内容作为键,可能会导致极其恶劣的后果。问题是使用 .toString 方法将 Object 属性强制转换为字符串。这可能会导致以下问题:

      function MyObject(name) {
        this.name = name;
      };
      var key1 = new MyObject("one");
      var key2 = new MyObject("two");
      
      var map = {};
      map[key1] = 1;
      map[key2] = 2;
      

      如果您期望 Object 的行为方式与此处的 Java Map 相同,那么您会很生气地发现该 map 仅包含 one 条目和 String 键 [object Object]:

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

      这显然 不是 Java 的 HashMap 的替代品。奇怪的是,考虑到它的时代,Javascript 目前还没有通用的地图对象。不过,希望就在眼前:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map 尽管浏览浏览器兼容性表会发现它还没有准备好用于通用 Web 应用程序。

      与此同时,您能做的最好的事情是:

      • 故意使用字符串作为键。 IE。使用显式字符串作为键,而不是依赖于您使用的键的隐式 .toString-ing。
      • 确保您用作键的对象具有明确定义的 .toString() 方法,该方法适合您对这些对象唯一性的理解。
      • 如果您不能/不想更改关键对象的 .toString,则在存储和检索条目时,将对象转换为代表您对唯一性理解的字符串。例如。 map[toUniqueString(key1)] = 1

      但有时,这是不可能的。如果您想基于例如 File 对象映射数据,则没有可靠的方法来执行此操作,因为 File 对象公开的属性不足以确保其唯一性。 (你可能有两个 File 对象代表磁盘上的不同文件,但是在浏览器的 JS 中没有办法区分它们)。不幸的是,在这些情况下,您所能做的就是重构您的代码,以消除将这些存储在可能的情况下的需要;也许,通过使用数组来代替它们并通过索引专门引用它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-14
        • 1970-01-01
        • 1970-01-01
        • 2020-11-03
        • 2017-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多