在javascript中是否有类似于Java中的Map类型?

时间:2015-03-17 20:45:18

标签: javascript

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

MDN似​​乎有Map类型,但只有IE11支持 在javascript中是否有类似于Java中提供地图功能的地图类型,例如,添加元素,通过地图迭代,类似的东西?谢谢!

2 个答案:

答案 0 :(得分:3)

您可以根据自己的需要使用常用对象。

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

如果您通过JavaScript api以及可以添加,删除和访问的语言(它们看起来像地图,但没有附加所有方法,那么您可以在Java地图上找到它们)它们非常灵活

除此之外,他们可以提供很多帮助,如果你不是在寻找hashmap<> s或treemap<> s

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

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

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

  

比较对象和地图

     

对象类似于Maps,它们都允许您将键设置为值,检索这些值,删除键以及检测某些键是否存储在键中。因此,对象在历史上被用作地图;但是,对象和地图之间存在重要差异,这使得使用地图变得更好。

     

对象有一个原型,因此地图中有默认键。但是,可以使用map = Object.create(null)绕过此值。   Object的键是字符串,它们可以是Map的任何值。   您必须手动跟踪对象的大小,才能轻松获得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如果你想使用Map(“这是一种实验技术”)。对象无处不在,并且适用于所有浏览器。

答案 1 :(得分:1)

可以创建自己的。

这是一个起点:



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 + '');
&#13;
&#13;
&#13;