我想编写一个迭代数组对象和对象的函数版本,并且重复代码最少。就像是:
function (arr_or_obj) {
arr_or_obj.forEach( function(key,value) {
// do stuff with key and value
});
}
这是在我意识到(至少在 Chrome 中)Object.keys
返回数组键列表之前。所以我可以用它来把 Array 当作一个对象来对待。像这样:
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 伪数组迭代器”之前。这样做的唯一好处是,我们无需获取 Array 的键列表(可能很长),而是通过仅生成我们需要的返回值来节省内存。像这样:
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
?