我通常建议不要添加东西,Array.prototype
因为那里有大量非常糟糕的 JavaScript。例如,如果您设置Array.protoype.next = function () {}
并且有人有以下代码,那么就会出现问题:
var total = 0, i, myArr = [0,1,2];
for(i in myArr) {
total += myArr[i];
}
total; //is probably "3next"
这种对循环的不良使用在for-in
外面非常普遍。Array
所以你通过添加到的原型来自找麻烦。但是,构建一个包装器来做你想做的事情是很容易的:
var iterifyArr = function (arr) {
var cur = 0;
arr.next = (function () { return (++cur >= this.length) ? false : this[cur]; });
arr.prev = (function () { return (--cur < 0) ? false : this[cur]; });
return arr;
};
var fibonacci = [1, 1, 2, 3, 5, 8, 13];
iterifyArr(fibonacci);
fibonacci.prev(); // returns false
fibonacci.next(); // returns 1
fibonacci.next(); // returns 1
fibonacci.next(); // returns 2
fibonacci.next(); // returns 3
fibonacci.next(); // returns 5
fibonacci.next(); // returns 8
fibonacci.prev(); // returns 5
fibonacci.next(); // returns 8
fibonacci.next(); // returns 13
fibonacci.next(); // returns false
几点注意事项:
首先,您可能希望它返回undefined
,而不是false
超过终点。其次,由于此方法cur
使用闭包隐藏,因此您无法在数组上访问它。所以你可能想要一个cur()
方法来获取当前值:
//Inside the iterifyArr function:
//...
arr.cur = (function () { return this[cur]; });
//...
最后,您的要求不清楚“指针”保持多远。以如下代码为例(假设fibonacci
设置如上):
fibonacci.prev(); //false
fibonacci.prev(); //false
fibonacci.next(); //Should this be false or 1?
在我的代码中,它会是false
,但您可能希望它是1
,在这种情况下,您必须对我的代码进行一些简单的更改。
哦,因为它是函数返回arr
,所以你可以在定义它的同一行上“迭代”一个数组,如下所示:
var fibonacci = iterifyArr([1, 1, 2, 3, 5, 8, 13]);
这可能会让你的事情变得更干净。您还可以通过重新调用iterifyArr
数组来重置迭代器,或者您可以编写一个方法来轻松重置它(只需设置cur
为 0)。