Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.04.2012, 23:05
Аспирант
Отправить личное сообщение для konstantinopol Посмотреть профиль Найти все сообщения от konstantinopol
 
Регистрация: 11.03.2009
Сообщений: 83

Функция iterator
Доброго времени суток,

учу JavaScript и наткнулся на проблемку.
Конкретнее: имеется
var Colors = ['#48AEFF', '#7FFFD4', '#C00054', '#87EF84', '#DBA7F8', '#EBC79E'];


(Color - глобальная переменная)

Нужна функция по типу итератора. При первом вызове функции возвращается первый цвет, при втором ... и т.д

Проблема в том что вне функции нельзя дефинировать переменные. Вот сижу и думаю, а как это можно сделать такую функцию без дополнительных counter за функцией? И если да как можно решить мою проблему.


Функция должна возвращать назад функцию и возможно парралельная итерация.
Бред полнейший, прошу помощи!

Зарание спасибо.

Последний раз редактировалось konstantinopol, 21.04.2012 в 23:08. Причина: Дописал
Ответить с цитированием
  #2 (permalink)  
Старый 21.04.2012, 23:26
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

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 можно будет использовать
Ответить с цитированием
  #3 (permalink)  
Старый 21.04.2012, 23:40
Аспирант
Отправить личное сообщение для konstantinopol Посмотреть профиль Найти все сообщения от konstantinopol
 
Регистрация: 11.03.2009
Сообщений: 83

Спасибо тебе добрый человек. А можно сделать так чтобы возвращалось не значение цвета а функция. У меня есть 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".

Благодарю!
Ответить с цитированием
  #4 (permalink)  
Старый 21.04.2012, 23:42
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Octane, я думаю, лучше lastIndex задать в массиве, а не в функции, а в функцию передавать этот массив в качестве аргумента. Так функция будет универсальной для любого массива. Но это занудство. Зависит, конечно, от задачи.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #5 (permalink)  
Старый 21.04.2012, 23:44
Аспирант
Отправить личное сообщение для konstantinopol Посмотреть профиль Найти все сообщения от konstantinopol
 
Регистрация: 11.03.2009
Сообщений: 83

Проблема в том что функция должна вызываться без оргументов.
Ответить с цитированием
  #6 (permalink)  
Старый 21.04.2012, 23:50
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Ну как-то так:
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
Ответить с цитированием
  #7 (permalink)  
Старый 21.04.2012, 23:55
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

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()]);
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #8 (permalink)  
Старый 21.04.2012, 23:58
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Сообщение от konstantinopol
А можно сделать так чтобы возвращалось не значение цвета а функция.
Что-то я не въехал в эту фразу.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #9 (permalink)  
Старый 21.04.2012, 23:59
Аспирант
Отправить личное сообщение для konstantinopol Посмотреть профиль Найти все сообщения от konstantinopol
 
Регистрация: 11.03.2009
Сообщений: 83

Нет они недолжны зависеть друг от друга. Всё просто супер, спасибо тебе, большое и человеческое. У меня помимо этого ещё 4 задания поэтому, если у меня возникнут сложности я ещё напишу. Но главное ведь начало. Ещё раз спасибо!
Ответить с цитированием
  #10 (permalink)  
Старый 22.04.2012, 00:00
Аспирант
Отправить личное сообщение для konstantinopol Посмотреть профиль Найти все сообщения от konstantinopol
 
Регистрация: 11.03.2009
Сообщений: 83

Сообщение от FINoM Посмотреть сообщение
Что-то я не въехал в эту фразу.
Это можно уведеть в ответе Octane. Виноват, мог бы подругому описать...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать где находится функция, на которую указывает javascript:openTag('mgmt') amigo* Общие вопросы Javascript 13 11.04.2012 12:11
функция и несуществующий id Ankh Элементы интерфейса 4 10.02.2012 23:49
функция не успевает Sadist_dead Элементы интерфейса 22 02.10.2011 19:00
Где вызывается функция? cradis Общие вопросы Javascript 5 23.04.2011 13:47
Не работает функция из подключаемого файла evgenyan jQuery 3 28.10.2010 14:48