1

私は JS オブジェクトを辞書として扱おうとしていますが、値のペア (1 つのリテラル値、もう 1 つのオブジェクト) を単一のキーとして使用したいと考えています。問題は、次のスニペットが示すように、キーを区別するためにリテラル値のみが機能していることです。

var dictionary = {};

var keyOne = { blah:1 };
var keyTwo = { blegh:2 };

var keyArrayOne = [keyOne, "label"];
var keyArrayTwo = [keyTwo, "label"];

dictionary[keyArrayOne] = "some data";

console.log(dictionary[keyArrayTwo]);    //Console returns 'some data'

辞書オブジェクトの代わりに配列を使用して、反復処理と比較を行うことができることはわかっていますが、より迅速なルックアップを利用したいと考えていました。

詳細については、キーの最初の要素を構成するオブジェクトについては何も知りませんが (何でもかまいません)、2 番目の部分は常に文字列です。

私が求めているものを達成する方法はありますか?

4

1 に答える 1

1

これらは役立つかもしれません:

https://stackoverflow.com/a/10893426/1090464

https://stackoverflow.com/a/10908885/1090464

  • JSON.stringify円形のオブジェクトでは機能しないことに注意してください。JSON.stringifyまた、そのメソッドはオブジェクト プロパティを同じ順序で返すことを前提としています (最初のリンクのコメントとhttps://stackoverflow.com/a/17459406/1090464を参照してください)。

  • 渡されるオブジェクトを変更することに関心がない場合は、もう 1 つの方法が機能します。同じ値を持つ別のインスタンスを使用すると機能しないため、まったく同じオブジェクト インスタンスを使用してルックアップを実行します。また、あなたの場合、get/put 関数は少し異なります。おそらく次のようになります。

    put: function(obj, label, value) {
        obj.__hash_id = this.nextId();
        this.hash[[obj.__hash_id, label]] = value;
    }
    
    get: function(obj, label) {
        return this.hash[[obj.__hash_id, label]];
    }
    
  • もう 1 つの方法として、ラベルをキーとして使用し、値を [objectPartOfKey, value] の配列にして、直線的に (ハッシュ テーブルのバケットのように) 検索する方法があります。ラベルごとのオブジェクトの数がオブジェクトの総数に対して「小さい」場合、これは [label, object] ペアの配列での線形検索よりも高速である可能性があります。

そうは言っても、元のコードを最適化してその価値があるかどうかを確認する前に、まずパフォーマンス ヒットを測定することをお勧めします。

于 2013-08-26T22:23:56.023 に答える