@Finch_85

Как можно улучшить эти функции?

Привет. С целью разобраться в работах со строками(были некоторые пробелы) написал пару функций. Но как мне кажется код громоздкий и его можно улучшить значительно. Посоветуйте, покритикуйте ,укажите на ошибки.

Итак, нужно написать метод, который находит все позиции вхождения подстроки в строку. Сделал 3 способами, один - подсмотрел.
function findAll(str, target) {
	let res = [];
	for(let position = 0; position < str.length; position++) {
		if(str.toLowerCase().indexOf(target.toLowerCase(), position) !==-1) {
			position = str.indexOf(target, position);
			res.push(str.indexOf(target, position));
		}
	}
	return res
}

function findAllTwo(str, target) {
	let position = 0,
		 result = [];
	while (true) {
		if (str.indexOf(target, position) ==-1) break;
		result.push(str.indexOf(target, position));
		position = str.indexOf(target, position)+1;
	} 
	return result;
}

function findAllThree(str, target) {
	let regexp = new RegExp(''+target+'', 'g');
	let res = [];
	while (result = regexp.exec(str)) {
	  res.push(result.index)
	}
	return res
}

// возвращает массив с позициями вхождения [10, 22, 46]
console.log( findAll('i have an apple, some appricots and fantastic apps', 'app') )
console.log( findAllTwo('i have an apple, some appricots and fantastic apps', 'app') )
console.log( findAllThree('i have an apple, some appricots and fantastic apps', 'app') )


Третий как мне кажется самый лучший, но как улучшить 2 предыдущих?
  • Вопрос задан
  • 143 просмотра
Решения вопроса 2
LaRN
@LaRN
Senior Developer
В первом примере можно немного оптимизировать время работы за счёт меньшего количества вызовов indexof:
function findAll(str, target) {
  let res = [];
  let ind = 0;
  for(let position = 0; position < str.length; position++) {
     if (ind <= position){
         ind = str.indexOf(target, position);
         if (ind == -1) break;
         res.push(ind);
     }
  }
  return res
}
Ответ написан
Xuxicheta
@Xuxicheta
инженер
function findAll(haystack, needle) {
  const str = haystack.toLowerCase();
  const target = needle.toLowerCase();
  const r = [];
  let z;
  for(let i = 0; i <= str.length; i++) {
    if(!~(z = str.indexOf(target, i))) break;
    r.push(z);
    i = z + needle.length;
  }
  return r.length ? r : false;
}

function findAllTwo(str, target) {
  let position = 0, z,
     result = [];
  while (~(z = str.indexOf(target, position))) {
    result.push(z);
    position = z + target.length;
  } 
  return result;
}


ну и проверку входных параметров еще надо
можно сократить строчку, засунув
for( let i = 0; ~(z = str.indexOf(target, i)); i++)
но это нечитабельно
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы