web-dev-qa-db-ja.com

JavaScriptハッシュマップはどのように実装されますか?

現在、私はOpenLayersを使用しており、ベクターレイヤーに描画するための膨大なデータ(100,000を超えるベクター)を持っています。

現在、これらすべてのベクトルをJavaScriptハッシュマップに入れて、パフォーマンスを分析しようとしています。 JavaScriptのハッシュマップがどのように実装されているかを知りたいのですが、それは実際のハッシュ関数か、単純なデータ構造と検索アルゴリズムを使用する単なるラップ関数ですか?

76
Patrick Hillert

すべてのjavascriptオブジェクトは、キーとして文字列値のみを受け入れる単純なハッシュマップであるため、次のようにコードを記述できます。

var map = {};
// add a item
map[key1] = value1;
// or remove it
delete map[key1];
// or determine whether a key exists
key1 in map;

javascriptオブジェクトは実装上の実際のハッシュマップであるため、検索の複雑さはO(1)ですが、javascript文字列専用のhashcode()関数はなく、javascriptエンジン(V8、SpiderMonkey、JScript。 dllなど)

ただし、今日のJavaScriptはキーとして文字列以外のデータ型をサポートしていません。ECMAv6(ハーモニー)は、キーとして任意のオブジェクトを受け入れるWeakMapクラスを導入しますが、時間がかかります。

175
otakustay

JavaScriptオブジェクトは、ハッシュマップの上に純粋に実装することはできません。

ブラウザコンソールでこれを試してください。

var foo = {
    a: true,
    b: true,
    z: true,
    c: true
}

for (var i in foo) {
    console.log(i);
}

...そして、あなたはそれらを挿入順序で受け取ります。これは デファクトスタンダード の振る舞いです。

ハッシュマップは本質的に順序を維持しないため、JavaScriptの実装はハッシュマップを何らかの方法でuseすることがありますが、そうする場合は、少なくとも別個のインデックスと挿入のための追加の簿記。

以下は、 Lars Bakのビデオで、v8がオブジェクトを実装するためにハッシュマップを使用しない理由を説明しています

32
Craig Barnes

Java map に似たものを使用する簡単で便利な方法を次に示します。

var map= {
    'map_name_1': map_value_1,
    'map_name_2': map_value_2,
    'map_name_3': map_value_3,
    'map_name_4': map_value_4
    }

そして値を取得するには:

alert( map['map_name_1'] );    // fives the value of map_value_1

......  etc  .....
19
Miloš

このクラスを試してくださいMap

var myMap = new Map();

// setting the values
myMap.set("1", 'value1');
myMap.set("2", 'value2');
myMap.set("3", 'value3');

myMap.size; // 3

// getting the values
myMap.get("1");    // "value associated with "value1"
myMap.get("2");       // "value associated with "value1"
myMap.get("3");      // "value associated with "value3"

注意:キーと値は任意のタイプにすることができます。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

5
Nguyen Tan Dat

プレーンな古いJavaScriptオブジェクトはマップとして使用できますが、通常、ほとんどのブラウザーとの互換性のために挿入順序を維持する方法で実装されているため(Craig Barnesの回答を参照)、単純なハッシュマップではありません。

ES6は適切なマップを導入します( MDN JavaScriptマップ を参照) 標準は言う

マップオブジェクトは、ハッシュテーブルまたは他のメカニズムを使用して実装する必要があります。これらのメカニズムは、平均して、コレクション内の要素の数に比例しないアクセス時間を提供します。

2
mb21
<html>
<head>
<script type="text/javascript">
function test(){
var map= {'m1': 12,'m2': 13,'m3': 14,'m4': 15}
     alert(map['m3']);
}
</script>
</head>
<body>
<input type="button" value="click" onclick="test()"/>
</body>
</html>
1
rajendra kumar

私はいくつかの一般的なキーでjsonを持っている問題に遭遇していました。同じキーを持つすべての値をグループ化したかった。サーフィンをしてから hashmap package を見つけました。これは本当に役に立ちます。

同じキーで要素をグループ化するために、multi(key:*, value:*, key2:*, value2:*, ...)を使用しました。

このパッケージはJava Hashmapコレクションに多少似ていますが、Java Hashmapほど強力ではありません。

0
dd619