Показать сообщение отдельно
  #29 (permalink)  
Старый 20.02.2011, 17:02
Профессор
Отправить личное сообщение для with-love-from-siberia Посмотреть профиль Найти все сообщения от with-love-from-siberia
 
Регистрация: 14.12.2009
Сообщений: 155

Эта задача не требует хаков, или дополнительных циклов. Задача действительно решается в один цикл. Не надо городить огород:
String.prototype.hasAt = function(needle, pos)
{
	var i = Math.min(this.length, Math.max(0, Number(pos) || 0));
	var j;
	var found;
	for ( ; i < this.length; i++) {
		if ( found ) {
			if ( i - j == needle.length ) {
				return j;
			}
			found = this.charAt(i) == needle.charAt(i - j);
		} else {
			found = this.charAt(i) == needle.charAt(0);
			if ( found ) {
				j = i;
			}
		}
	}
	return found && this.length - j == needle.length 
		? j 
		: -1;
};

Для "чистоты" эксперимента следовало бы заменить Math.min/Math.max соответствующими проверочными условиями, чтобы позиция начала поиска не выходила за пределы строки. Но это не существенно.

Последний раз редактировалось with-love-from-siberia, 20.02.2011 в 17:04.
Ответить с цитированием