Функция iterator
Доброго времени суток,
учу JavaScript и наткнулся на проблемку. Конкретнее: имеется var Colors = ['#48AEFF', '#7FFFD4', '#C00054', '#87EF84', '#DBA7F8', '#EBC79E']; (Color - глобальная переменная) Нужна функция по типу итератора. При первом вызове функции возвращается первый цвет, при втором ... и т.д Проблема в том что вне функции нельзя дефинировать переменные. Вот сижу и думаю, а как это можно сделать такую функцию без дополнительных counter за функцией? И если да как можно решить мою проблему. Функция должна возвращать назад функцию и возможно парралельная итерация. Бред полнейший, прошу помощи! Зарание спасибо. |
var Colors = ['#48AEFF', '#7FFFD4', '#C00054', '#87EF84', '#DBA7F8', '#EBC79E'];
function getColor() {
var fn = arguments.callee;
if (!("lastIndex" in fn) || fn.lastIndex >= Colors.length) {
fn.lastIndex = 0;
}
return Colors[fn.lastIndex++];
}
alert([getColor(), getColor(), getColor(), getColor(), getColor(), getColor(), getColor()]);
В будущем yield можно будет использовать |
Спасибо тебе добрый человек. А можно сделать так чтобы возвращалось не значение цвета а функция. У меня есть test.js которая должна пройти без ошибок. Может с ней будет более понятно что мне нужно...
Вот она:
console.clear();
console.log('==Color Iterator Test==');
var test = function(msg, bool){
if(bool){
console.log("passed");
} else {
console.log("failed - "+msg);
}
};
var colorIter1 = AIS.colorIterator();
var colorIter2 = AIS.colorIterator();
test("return value not a function", typeof(colorIter1) === 'function');
// two cycles
test("color not correct", colorIter1() === '#48AEFF');
test("color not correct", colorIter1() === '#7FFFD4');
test("color not correct", colorIter1() === '#C00054');
test("color not correct", colorIter1() === '#87EF84');
test("color not correct", colorIter1() === '#DBA7F8');
test("color not correct", colorIter1() === '#EBC79E');
test("color not correct", colorIter1() === '#48AEFF');
test("color not correct", colorIter1() === '#7FFFD4');
test("color not correct", colorIter1() === '#C00054');
test("color not correct", colorIter1() === '#87EF84');
test("color not correct", colorIter1() === '#DBA7F8');
test("color not correct", colorIter1() === '#EBC79E');
for(var i = 0; i < 12; i++){
test("color not correct while iterating two iterators", colorIter1() === colorIter2());
};
А вот что получилось у нас за функция(ранее имена были немного другими):
var AISShipColors = ['#48AEFF', '#7FFFD4', '#C00054', '#87EF84', '#DBA7F8', '#EBC79E'];
var colorIterator = function(){
var fn = arguments.callee;
if (!("lastIndex" in fn) || fn.lastIndex >= AISShipColors.length) {
fn.lastIndex = 0;
}
return AISShipColors[fn.lastIndex++];
};
И первое что выдаётся в консоле это "return value not a function". Благодарю! |
Octane, я думаю, лучше lastIndex задать в массиве, а не в функции, а в функцию передавать этот массив в качестве аргумента. Так функция будет универсальной для любого массива. Но это занудство. Зависит, конечно, от задачи.
|
Проблема в том что функция должна вызываться без оргументов.
|
Ну как-то так:
var AIS = {};
var AISShipColors = ['#48AEFF', '#7FFFD4', '#C00054', '#87EF84', '#DBA7F8', '#EBC79E'];
AIS.colorIterator = function () {
var lastIndex = 0;
return function () {
if (lastIndex >= AISShipColors.length) {
lastIndex = 0;
}
return AISShipColors[lastIndex++];
};
};
var colorIter1 = AIS.colorIterator();
alert([colorIter1(), colorIter1(), colorIter1(), colorIter1(), colorIter1(), colorIter1(), colorIter1()]);
Если итераторы должны зависеть друг от дурга, то просто сделайте lastIndex свойством массива, как написал FINoM |
var Iterator = function( array ) {
this.array = array;
this.index = -1;
this.iterate = function() {
return this.array[ ++this.index ] || this.array[ this.index = 0 ]
}
}
var iterator = new Iterator(['a', 'b', 'c', 'd', 'e']);
alert([iterator.iterate(), iterator.iterate(), iterator.iterate(), iterator.iterate(), iterator.iterate(), iterator.iterate(), iterator.iterate()]);
|
Цитата:
|
Нет они недолжны зависеть друг от друга. Всё просто супер, спасибо тебе, большое и человеческое. У меня помимо этого ещё 4 задания поэтому, если у меня возникнут сложности я ещё напишу. Но главное ведь начало. Ещё раз спасибо!
|
Цитата:
|
| Часовой пояс GMT +3, время: 12:50. |