単純な JavaScript で Dictionary を実現するのはかなりトリッキーです。これを処理するには、コンストラクター全体を作成するか、これを処理するライブラリを使用する必要があります。
辞書では、オブジェクトをキーとして使用できるオブジェクト/ハッシュを参照しています。複数の配列 (キー用に 1 つと値用に 1 つ) を使用し、同期を維持するコンストラクターが必要です。典型的な配列メソッドの多くを模倣できますが、前述したように、これはかなりのコードになります。
簡単な代替手段として、次のことができます。
function pushToObject(obj, key, value){
if( !key||!obj ) return false;
if( !key[''] ) {
pushToObject.index = pushToObject.index||[];
key[''] = pushToObject.index.length;
pushToObject.index.push(key);
}
obj[key['']] = value;
return true;
}
function removeFromObject(obj, key){
if( !isNaN(key) ) {
var list = listKeyObjects(obj);
var item = list[key];
return removeFromObject(obj,item);
}
else if(key) {
if( !key[''] ){
return false;
}
return delete obj[key['']];
}
return false;
}
function listKeyObjects(obj){
var a = [];
for(var i in obj){
a.push(pushToObject.index[i]);
}
return a;
}
利用方法
var array = {}; /// it would be best to change the name of this object
var an_object = {}, another_object = {};
/// add your items to the array object, this handles giving each of your
/// objects used as a key a unique index property. This does mean the objects
/// you use `an_object`, `another_object` are modified.
pushToObject( array, an_object, 'something else' );
pushToObject( array, another_object, 'something other than else' );
console.log(array); /// {0:'something else',1:'something other than else'}
removeFromObject( array, an_object ); /// remove using an object as a key
console.log(array); /// {1:'something other than else'}
removeFromObject( array, 0 ); /// remove using an offset index
console.log(array); /// {}
考えた後
明らかに、このための独自の専用コンストラクターを作成する方が良いオプションですが、キー オブジェクトを変更しないように、もう少しコードを追加して上記を改善できます。pushToObject.index
代わりに、オブジェクトをキーとして操作するときはいつでも、キー オブジェクトのオフセットをスキャンできます。キーオブジェクトを変更するバージョンを選択しましたが、配列を変更するたびにリストをスキャンするよりも高速に機能するはずです。
キー関数を取得
上記のコードは、追加方法と削除方法を示しているだけですが、オフセットから特定のキー オブジェクトを取得することもお勧めします。
function getKeyObjectAtIndex = function(obj, index){
var list = listKeyObjects(obj);
return list[index] ? list[index] : null;
}
console.log(array); /// {0:'something else',1:'something other than else'}
var key = getKeyObjectAtIndex(array, 1);
console.log(key === another_object) /// === TRUE