web-dev-qa-db-ja.com

JavaScript / JQueryを使って簡単な地図を作成する方法

この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);
}
184
Marcus Leon

編集:時代遅れの答えは、ECMAScript 2015(ES6)標準のjavascriptは、地図の実装を持っています、詳細についてはここを読んで: https://developer.mozilla.org/en-US/docs/ウェブ/ JavaScript /リファレンス/ 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);
283
Simen Echholt

単純なオブジェクトを使うだけです:

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

これは古い質問ですが、既存の回答は非常に危険なものになる可能性があるため、この回答は、ここで遭遇する可能性のある将来の人々のために残したいと思いました...

ObjectをHashMapとして使用することに基づく回答は壊れており、String以外のものをキーとして使用すると、非常に厄介な結果を引き起こす可能性があります。問題は、Objectプロパティが.toStringメソッドを使用してStringに強制変換されることです。これは、次のような不快感をもたらす可能性があります。

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]を持つ1つのエントリだけを含むことを発見するのはかなり賢明でしょう:

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

これは明らかにJavaのHashMapに代わるものではありません。奇妙なことに、その年齢を考えると、Javascriptには現在汎用のマップオブジェクトがありません。しかし、地平線には希望があります。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map ブラウザ互換性テーブルを見ると、これはまだ汎用Webアプリケーションで使用する準備ができていないことがわかります。

それまでの間、あなたができる最善のことは次のとおりです。

  • 故意にキーとして文字列を使用してください。すなわち暗黙的に使用するキーの.toStringに依存するのではなく、明示的な文字列をキーとして使用します。
  • キーとして使用しているオブジェクトに、これらのオブジェクトの一意性についての理解に適した明確な.toString()メソッドがあることを確認してください。
  • キーオブジェクトの.toStringを変更することができない、またはしたくない場合は、エントリを格納および取得するときに、オブジェクトを一意性の理解を表す文字列に変換します。例えば。 map[toUniqueString(key1)] = 1

時々、しかし、それは不可能です。 Fileオブジェクトなどに基づいてデータをマップしたい場合は、Fileオブジェクトが公開する属性がその一意性を保証するのに十分ではないため、これを行う信頼できる方法はありません。 (ディスク上の異なるファイルを表す2つのFileオブジェクトがあるかもしれませんが、ブラウザのJSでそれらを区別する方法はありません)。これらの場合、残念ながら、できることはすべて、コードをリファクタリングすることで、これらを強力に保存する必要がなくなります。おそらく、代わりに配列を使用し、それらをインデックスによって排他的に参照することによって。

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

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
polydor