【问题标题】:Is there a Map type in javascript similar to what is in Java? [duplicate]javascript 中是否有类似于 Java 中的 Map 类型? [复制]
【发布时间】:2015-05-20 11:39:30
【问题描述】:

我做了一些研究,似乎我们可以使用Jquery.map() 或创建一个javascript 对象:var Map = {}; 但它们似乎都没有提供丰富的功能来轻松操作地图。

MDN 好像有Map 类型,但只有IE11支持。
javascript中是否有类似于Java中提供地图功能的地图类型,例如,添加元素,遍历地图,诸如此类?谢谢!!

【问题讨论】:

  • 所有 Javascript 对象本身就像地图。见stackoverflow.com/questions/8312459/…
  • coming,你可以用es6 shim
  • 你想做什么? Javascript 是一种与 Java 非常不同的语言,并且可能有一种方法可以轻松地做你想做的事情,而你的问题会阻止被问到。
  • 真的,如果你可以更具体的话。通常 var Map = {} 就足够了。这个解决方案的问题是方法没有附加,但它们是语言的一部分(访问对象的属性),这可能会让你感到困惑。

标签: javascript


【解决方案1】:

你可以使用通用对象,这取决于你想要什么。

var thing = {property:"value", otherProperty:"othervalue"};

如果您通过 JavaScript api 和可以从对象中添加、删除和访问的语言,它们非常灵活,这看起来像一个地图,但没有附加所有方法,您可以在 Java 地图上找到这些方法.

除了它们可以提供很多帮助之外,如果您不是在寻找 hashmaps 或 treemaps

这个解决方案的问题是方法没有附加,就像在一个类中一样,但它们是语言的一部分(访问对象的属性),这可能会让你感到困惑。

一些可能有用的链接(它们是一些基本的东西,但如果它可以帮助某人......):

How to create a simple map using JavaScript/JQuery

JavaScript property access: dot notation vs. brackets?

http://www.w3schools.com/js/js_properties.asp

http://www.sitepoint.com/back-to-basics-javascript-object-syntax/

一个有趣的报价(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map):

比较对象和地图

Objects 与 Maps 相似,都允许您将键设置为值、检索这些值、删除键以及检测是否在键中存储了某些内容。正因为如此,对象在历史上一直被用作地图;然而,Objects 和 Maps 之间的重要区别使得使用 Map 更好。

一个对象有一个原型,所以映射中有默认键。但是,这可以使用 map = Object.create(null) 绕过。 Object 的键是字符串,它们可以是 Map 的任何值。 您可以轻松获取地图的大小,而您必须手动跟踪对象的大小。 当键在运行时之前未知,并且所有键的类型相同且所有值的类型相同时,对对象使用映射。

一个例子(How to create a simple map using JavaScript/JQuery):

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

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

PS 如果你想使用地图(“这是一项实验性技术”)。对象无处不在,并且针对所有浏览器进行了标准化。

【讨论】:

    【解决方案2】:

    可以创建自己的。

    这是一个起点:

    var Map = (function() {
    
      return function() {
        var hashMap = {};
        var hashOrder = [];
    
        return {
          get: function(key) {
            if (hashMap[key]) {
              return hashMap[key];
            }
          },
          has: function(key) {
            return hashOrder.indexOf(key) > -1;
          },
          set: function(key, value) {
            if (this.has(key)) {
              throw new Error('Cannot set a key that already exists!');
            }
            hashOrder.push(key);
            return hashMap[key] = value;
          },
          remove: function(key) {
            var index = hashOrder.indexOf(key);
            if (index > -1) {
              hashOrder.splice(index, 1);
            }
            return delete hashMap[key];
          },
          values: function() {
            var arr = [];
            this.each(function(value) {
              arr.push(value);
            });
            return arr;
          },
          keys: function() {
            return hashOrder;
          },
          each: function(fn) {
            var key;
            var i = 0;
            var length = hashOrder.length;
            for (i; i < length; ++i) {
              key = hashOrder[i];
              fn(hashMap[key], key);
            }
          },
          toJSON: function() {
            var jsonString = JSON.stringify(hashMap);
    
            return JSON.parse(jsonString);
          },
          toString: function() {
            return JSON.stringify(hashMap);
          }
            //..etc
        };
      };
    })();
    
    // then you can do:
    
    
    var map = new Map();
    map.set('lemons', 12);
    map.set('peanuts', 42);
    console.log(map.values(), map.keys());
    map.each(function(value, key) {
      console.log('EACH', value, key);
    });
    console.log(map.toJSON(), map + '');

    【讨论】:

    • 谢谢大家的cmets!!
    • @jlp 这可以让操作员功能变得更加出色,例如 next first last 等。我可能会稍后添加
    • @jlp 更新了一些有趣的代码 :-)
    猜你喜欢
    • 1970-01-01
    • 2021-03-04
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    相关资源
    最近更新 更多