JavaScriptオブジェクトを辞書として使用しており、大文字と小文字を区別しないようにする必要がありました。私はこれを実装するためにObject.defineProperty()
を使用:JavaScriptオブジェクトキーを検索する時間の複雑さは何ですか?
Object.defineProperty(Object.prototype, "getKeyUpperCase", {
value: function(prop) {
for (var key in this) {
if (key.toUpperCase() === prop.toUpperCase()) {
return this[key];
};
};
},
enumerable: false
});
JavaScriptでキーを経由してオブジェクトを検索する時の複雑さとは何ですか?私は約100万の鍵を保持する辞書を期待しています。
私には、最悪の場合はO(n)
、最善のケースはO(1)
、平均の場合はO(n/2)
と思われます。これは正しいです?
オブジェクトのキーを配列(Object.Keys(dictionary).map(function(key) return key.toUpperCase()).sort()
)として取得して、キーが存在するかどうかを確認する方が効率的でしょうか?この操作の平均時間複雑度がO(log n)
であるということを訂正しますか?辞書の
使い方は、この線に沿っている:
すべてのキーを検索する必要はありません...単一キーのすべての可能性のあるケースをテストするだけです。つまり、this ['name'] 'vs' this ['Name'] 'vs 'this ['NAme']'と続きます。さらに、辞書の代わりに直接[Proxy](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy)を使用して、確実に確認することができます各キーセットは、設定時に常に小文字/大文字になります。 –
ありがとうございます。私はそれを考えなかった。それは私がやったことよりも速いでしょうか?私は辞書がJavaScriptでどのように実装されているかわからないので、パフォーマンスを比較する方法がわかりません –
テストするキーの長さによって異なります。キーの可能な各ケースを作成してからテストする必要があります。その数はかなり大きくなる可能性があります。 setterとgetterの両方で 'this [key.toLowerCase()] 'を使用しているだけで検索が行われないので、私は個人的にプロキシルート(サポートされているブラウザを使用している場合)に行きます。 –