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に設定するだけです)。