Как улучшить функцию

363
22 октября 2017, 23:34

function replaceString(initString, strToReplace, replacer) { 
	let result = initString; 
	let i = 0; 
	let len = strToReplace.length; 
	while (len) { 
		i = result.indexOf(strToReplace, i); 
		if (i == -1) { 
			break; 
		} 
		result = result.substring(0, i) + replacer + result.substring(i + len); 
		i += len; 
	} 
	return result; 
} 
let newStr = replaceString("Я не люблю JavaScript", "не люблю", "люблю"); 
console.log(newStr)

Подскажите как улучшить эту функцию

Answer 1

Почему бы не воспользоваться стандартной функцией replace?

function replaceString(initString, strToReplace, replacer) { 
  return initString.replace(strToReplace, replacer); 
} 
 
let newStr = replaceString("Я не люблю JavaScript", "не люблю", "люблю"); 
console.log(newStr)

Или если нужно заменить все "не люблю":

function replaceString(initString, strToReplace, replacer) { 
  return initString.replace(new RegExp(strToReplace, 'g'), replacer); 
} 
 
let newStr = replaceString("Я не люблю JavaScript", "не люблю", "люблю"); 
console.log(newStr)

Answer 2

Не совсем ясны цели и ограничения на собственную реализацию replace. Можно как один из вариантов рассмотреть вариант в котором сначала использовать функцию split, которая разделит строку, используя в качестве разделителя strToReplace. В результате получится массив в каждой ячейке которого будут последовательно лежать части строки без strToReplace:

console.log("Я не люблю JavaScript и не люблю Василия".split("не люблю"));
а потом объединить этот массив в строку, используя функцию join. Которая возьмет все элементы массива и сделает из них строку, вставляя между элементами replacer.

Получится так:

function replaceString(initString, strToReplace, replacer) { 
    return initString.split(strToReplace).join(replacer); 
} 
 
console.log(replaceString("Я не люблю JavaScript и не люблю Василия", "не люблю", "люблю"));

Ну а что касается вашей реализации, то можно только косметически:

сделать len константой, потому что она никогда не изменяется

const len = strToReplace.length;

и сделать условие выполнения бесконечного цикла нормальным true

while (true) {
Answer 3

Ответ уже есть один, предложу свой вариант на основе идеи автора:

function replaceString(initString, strToReplace, replacer) {
  let result = initString;
  let i = 0;
  while ((i = result.indexOf(strToReplace, i)) != -1) {
    result = result.substring(0, i) + replacer
      + result.substring(i + strToReplace.length, result.length);
  }
  return result;
}
console.log(replaceString('Я не люблю JavaScript', 'не люблю', 'люблю'));
console.log(replaceString('Тут нет таких слов', 'привет', 'пока'));
console.log(replaceString('Я люблю яблоки и яблоки', 'яблоки', 'девочек'));
READ ALSO
как изменить функцию?

как изменить функцию?

Подскажите как изменить функцию:

301
Поделиться google, кодировка (неправильный tittle, description)

Поделиться google, кодировка (неправильный tittle, description)

После нажатия кнопки "поделится, на g+" при создании поста внизу (там где ссылка ), вместо тайтла отображает иероглифыС остальными кнопками...

281
Валидация Laravel

Валидация Laravel

Могу ли я с помощью валидации в контроллере задать максимальное значение числа? Тк

259
Как защитить данные в куках?

Как защитить данные в куках?

Добра всем) Нужно запомнить пользователя в куках

208