如何使用JavaScript / JQuery创建简单的地图[重复]

2020/10/18 11:41 · javascript ·  · 0评论

如何创建与此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);
}

编辑:过期的答案,ECMAScript 2015(ES6)标准javascript具有Map实现,请在此处阅读更多信息:https : //developer.mozilla.org/zh-CN/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);

只需使用普通对象:

var map = { key1: "value1", key2: "value2" }
function get(k){
  return map[k];
}
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;
    };
}

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

如果使用String以外的任何键作为关键字,则基于将对象用作HashMap的答案将被破坏,并且可能导致极其恶劣的后果。问题是使用.toString方法将对象属性强制转换为字符串。这可能导致以下麻烦:

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仅包含一个带有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应用程序了。

同时,您可以做的最好的事情是:

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

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

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

如果您不限于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
本文地址:http://javascript.askforanswer.com/ruheshiyongjavascript-jquerychuangjianjiandandedituzhongfu.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!