私は現在OpenLayersを使用しており、ベクターレイヤー(100000を超えるベクター)に描画するための膨大なデータセットを持っています。
現在、これらすべてのベクトルをJavaScriptハッシュマップに入れて、パフォーマンスを分析しようとしています。JavaScriptのハッシュマップがどのように実装されているのか知りたいのですが、それは実際のハッシュ関数ですか、それとも単純なデータ構造と検索アルゴリズムを使用するラップされた関数ですか?
私は現在OpenLayersを使用しており、ベクターレイヤー(100000を超えるベクター)に描画するための膨大なデータセットを持っています。
現在、これらすべてのベクトルをJavaScriptハッシュマップに入れて、パフォーマンスを分析しようとしています。JavaScriptのハッシュマップがどのように実装されているのか知りたいのですが、それは実際のハッシュ関数ですか、それとも単純なデータ構造と検索アルゴリズムを使用するラップされた関数ですか?
回答:
すべての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)ですがhashcode()
、javascript文字列専用の関数はなく、javascriptエンジン(V8、SpiderMonkey、JScript.dllなど)によって内部的に実装されます。 。)
2020年の更新:
今日のjavascriptは、他のデータ型もサポートしています:Map
とWeakMap
。これらは、従来のオブジェクトよりもハッシュマップとしてより密接に動作します。
map[2] = 'foo'
内部的に文字列にキャストされることに注意してください> map = { '2': 'foo' }
JavaScriptオブジェクトは、ハッシュマップの上に純粋に実装することはできません。
ブラウザコンソールでこれを試してください。
var foo = {
a: true,
b: true,
z: true,
c: true
}
for (var i in foo) {
console.log(i);
}
...そして、挿入順にそれらを受け取ります。これは事実上の標準的な動作です。
ハッシュマップは本質的に順序を維持しないため、JavaScript実装は何らかの方法でハッシュマップを使用する場合がありますが、そうする場合は、少なくとも個別のインデックスと挿入用の追加の簿記が必要になります。
このクラスを試してみてください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
プレーンな古いJavaScriptオブジェクトはマップとして使用できますが、通常、ほとんどのブラウザーとの互換性のために挿入順序を維持する方法で実装されているため(Craig Barnesの回答を参照)、単純なハッシュマップではありません。
ES6は(参照適切な地図を紹介しMDN JavaScriptの地図をそのうち)標準は言います:
マップオブジェクトは、ハッシュテーブルまたは他のメカニズムを使用して実装する必要があります。これらのメカニズムは、平均して、コレクション内の要素の数に対して劣線形のアクセス時間を提供します。
<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>
私はいくつかの共通のキーを持つjsonを持っているという問題に遭遇していました。同じキーを持つすべての値をグループ化したかったのです。サーフィンをした後、ハッシュマップパッケージを見つけました。これは本当に役に立ちます。
同じキーで要素をグループ化するために、を使用しましたmulti(key:*, value:*, key2:*, value2:*, ...)
。
このパッケージはJavaHashmapコレクションにいくぶん似ていますが、JavaHashmapほど強力ではありません。