私はJavaScriptで2つの数字を持っています。Javascript 2つの数字をハッシュする
これらは整数座標です。
、私もオブジェクトがあります:var regions = {};
を私は可能な限り迅速に特定のオブジェクトにアクセスできるようにしたいと思います。
など。 (5、-2)にオブジェクトがある可能性があります
このような2つの数字のために、一意のハッシュを作成するにはどうすれば衝突するのでしょうか?
私はJavaScriptで2つの数字を持っています。Javascript 2つの数字をハッシュする
これらは整数座標です。
、私もオブジェクトがあります:var regions = {};
を私は可能な限り迅速に特定のオブジェクトにアクセスできるようにしたいと思います。
など。 (5、-2)にオブジェクトがある可能性があります
このような2つの数字のために、一意のハッシュを作成するにはどうすれば衝突するのでしょうか?
アクセスしたい「特定のオブジェクト」がregions
のプロパティで参照されているとします。 JavaScriptのオブジェクトプロパティは、文字列名またはSymbol
の名前で命名されます。この場合、文字列を使用します。文字列であることを行っていますので
、簡単な解決策は、単なる文字列を作成し、それでそれを見ている:JavaScriptエンジンにそれを残し
var obj = regions[num1 + "," + num2];
を見上げ良い仕事をするためにプロパティ。 JavaScriptエンジンは非常に良い(読み込みは高速)です。なぜなら、彼らはそれを行う必要があるからです。たくさんです。
regions
オブジェクトがどのように作成されるかは、エンジンが検索する方法によって決まります。可能であれば、現代のエンジンは事実上マイクロクラスであり、プロパティ名の非常に迅速な解決を提供するオブジェクトを作成します。あなたが特定のことをするなら(例えば、プロパティの一つにdelete
を使うなど)、最新のエンジンはハッシュルックアップを使う "辞書"モードに戻ってしまうかもしれません。これはまだ高速ですが、最適化された形式ほど高速ではありません。
私はあなたがそれをより迅速に見つけることは疑う。理論的には、region
が要素が連続した配列を参照する連続した配列だった場合、JavaScriptエンジンはそれらの真の配列を覆い隠すことができ、実際の配列が使用されないように、そして、あなたはまだ2つのルックアップ(最初の数字、次に2番目の数字)を実行していて、それが速くなるという保証はありません。確かにもっと複雑になるでしょう。
あなたが言いましたように、あなたはあなたがその解決策にパフォーマンス上の問題がないかぎり、簡単な複合文字列キーを使用します。次に、連続した配列を取得しようとしますターゲットエンジンで起こります(これらの負のインデックスを別のものに変換すると問題になる可能性があります)。ルックアップがすべてのボトルネックであることがわかります。
例:
var regions = {
'5,-2': { ... },
'1,3': { ... }
};
、あなたが簡単に鍵を生成し、対応するオブジェクトにアクセスできる2つの数値がある場合、その後:
var x = 5;
var y = -2;
var obj = regions[x + ',' + y];
を私は2つの機能encode
とdecode
を使用。
var x = 10;
var y = -3.2;
function encode(x, y) {
return x + ',' + y;
}
function decode(code) {
var xy = code.split(',');
return [+xy[0], +xy[1]];
}
var code = encode(x, y);
console.log(code);
var xy = decode(code);
console.log(xy);
code
は、dictキー値として使用できます。
あなたは配列表記を使用することができますフードの下[5,-2]
を"5,-2"
に文字列化されるよう
var regions = {}
regions[[5,-2]] = myObject;
regions[[5,-2]]; // myObject
オブジェクトキーは、配列することができません。しかし、私は配列の表記法を使用すると手動で文字列化するよりも美しいと思います。
文字列を作成するためだけに配列を作成することは、まさにラウンドアバウトのようです。オペレーションが主にパフォーマンスに関係している場合(ただし、このオペレーションのパフォーマンスは主な懸案事項ではないと思われます)。 –
@ T.J.Crowder文字列を連結するのではなく、配列を作成して最後に結合する方が良いということを読んだ。しかし、はい、パフォーマンスの違いはごくわずかです。私はそれがよりかわいいので、この方法が好きです。 – Oriol
これは長いことですが、複数の連結(テンプレートなどから何かを構築すること)の文脈でありました。最新のJavaScriptエンジンとespで。単一の連結で、私はオーバーヘッドがそれに値するものではないと確信しています。もちろん、ターゲットエンジンをチェックしてください。 –
'regions 'はどのように作成されますか?一度にリテラルで、または段階的にすべて? –
@ T.J.Crowder、それはネットワークアプリケーションなので、リージョンはウェブソケットを介して送信されます。それらは配列内の複数のグループになります。例えば。 (0,0)と別の周り(500,20)など – Lolums
あなたはあなたがパースした1つの大きなメッセージを得るのですか? –