重複コードを最小限に抑えて、配列オブジェクトとオブジェクトの両方を反復処理する関数の 1 つのバージョンを作成したいと考えました。何かのようなもの:
function (arr_or_obj) {
arr_or_obj.forEach( function(key,value) {
// do stuff with key and value
});
}
これは、(少なくとも Chrome では)Object.keys
が配列のキーのリストを返すことに気付く前のことです。したがって、それを使用して、配列をオブジェクトのように扱うことができます。そのようです:
function (arr_or_obj) {
var keys = Object.keys(arr_or_obj);
keys.forEach( function(key) {
var value = arr_or_obj[key];
// do stuff with key and value
});
}
問題が解決しました。しかし、これは私が独自の「JavaScript 疑似配列反復子」を作成する前ではありませんでした。これの唯一の利点は、配列のキーのリスト (非常に長くなる可能性があります) を取得する代わりに、必要な戻り値のみを生成することでメモリを節約できることです。そのようです:
function create_iterator(max) {
var jkeys = {};
jkeys.count_ = 0;
jkeys.length = max;
jkeys.getter_ = function() {
var returnable = jkeys.count_;
jkeys.count_ += 1;
jkeys.__defineGetter__(jkeys.count_,jkeys.getter_);
delete jkeys[jkeys.count_-1];
return returnable;
};
jkeys.__defineGetter__(0, jkeys.getter_);
return jkeys;
}
次に、次のようにして呼び出すことができます。
var z = create_iterator(100);
z[0];
>> 0
z[0];
>> undefined
z[1];
>> 1;
z[2]
>> 2;
...
これは一種の質問と回答のようなものですが、明らかな質問は、を使用せずにこれを行うより良い方法はありObject.keys
ますか?