Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.02.2020, 17:50
Аспирант
Отправить личное сообщение для Dark Souls Посмотреть профиль Найти все сообщения от Dark Souls
 
Регистрация: 06.03.2017
Сообщений: 37

str_replace как в php
Help граждане гуру.

String.prototype.str_replace_all ()
{
    if (Array.isArray(arguments[0])) {
        for (let i = 0; i < arguments[0].length; i++) {
            this.replace(new RegExp(arguments[0][i], "gi"),  Array.isArray(arguments[1]) ? arguments[1][i] : arguments[1]));
        }
    }
}

"one two three for five".str_replace_all(["two", "for"], "|");

А оно не работает. Что не так?
Ответить с цитированием
  #2 (permalink)  
Старый 08.02.2020, 18:02
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

Вон вверху есть "Аналоги функций PHP", чтоб тебе не писать своих костылей, и в частности str_replace.

А конкретно у тебя не так - всё. Это даже не javascript, на неряшливый набор букв.

Синтаксис:
1.String.prototype.str_replace_all () { ... } - такой конструкции в javascript нет.
2.this.replace( ... )); - в конце лишняя скобка.

Логика:
1. Чтобы получить результат - функция должна возвращать результат. Отсутствует return.
2. Метод replace не меняет исходную строку. Нет сохранения результата.
3. Строки попадающие в new RegExp должны быть экранированы. Если там попадутся спецсимволы всё упадёт.
4. Нет проверки переданных аргуметов.

Стиль:
1. Использование arguments нежелательно, если нужно получить массив входных аргументов используйте ...args.
2. Для именования в javascript принят camelCase, snake_case не рекомендован.
__________________
29375, 35

Последний раз редактировалось Aetae, 08.02.2020 в 18:20.
Ответить с цитированием
  #3 (permalink)  
Старый 08.02.2020, 18:21
Аспирант
Отправить личное сообщение для Dark Souls Посмотреть профиль Найти все сообщения от Dark Souls
 
Регистрация: 06.03.2017
Сообщений: 37

Сообщение от Aetae Посмотреть сообщение
Вон вверху есть "Аналоги функций PHP", чтоб тебе не писать своих костылей, и в частности str_replace.

А конкретно у тебя не так - всё. Это даже не javascript, на неряшливый набор букв.
К сожалению верхний аналог мне не подходит.
Надо чтобы реплейсер работал через регулярку.
"двенадцать миллиардов триста четырнадцать миллионов четыреста шестьдесят семь"
- например в этой строке заменить название разрядов на запятые для разбития на массив. Регулярка нужна для удаления пробелов и вариаций окончаний разрядов.

Ну, покажите пример ряшливого кода. может поучусь.
Ответить с цитированием
  #4 (permalink)  
Старый 08.02.2020, 18:27
Аспирант
Отправить личное сообщение для Dark Souls Посмотреть профиль Найти все сообщения от Dark Souls
 
Регистрация: 06.03.2017
Сообщений: 37

String.prototype.replace_all = function () {
	// let args = arguments;

	if (Array.isArray(arguments[0]))
	{
		for (let i in arguments[0]) {
			this.replace(new RegExp(arguments[0][i], "gi"), Array.isArray(arguments[1]) ? arguments[1][i] : arguments[1]);
		}
	}

	console.log(arguments);
	return this;
}


Изначально она выглядит так.
Ответить с цитированием
  #5 (permalink)  
Старый 08.02.2020, 18:29
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Dark Souls,
что на входе, что на выходе?
Ответить с цитированием
  #6 (permalink)  
Старый 08.02.2020, 18:36
Аспирант
Отправить личное сообщение для Dark Souls Посмотреть профиль Найти все сообщения от Dark Souls
 
Регистрация: 06.03.2017
Сообщений: 37

Сообщение от рони Посмотреть сообщение
Dark Souls,
что на входе, что на выходе?
на входе и два параметра, ([], []), ([], ""), ("", "") - массивы одномерные.
("", []) - такого варианта быть не может.

на выходе измененная строка.

Последний раз редактировалось Dark Souls, 08.02.2020 в 18:38. Причина: дополнил
Ответить с цитированием
  #7 (permalink)  
Старый 08.02.2020, 18:38
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Dark Souls,
если не будет служебных символов
String.prototype.str_replace_all = function(arRegexp, str) {
var expr = new RegExp(arRegexp.join("|"), "gi");
return this.replace(expr, str)
}
alert("one two three for five".str_replace_all(["two", "for"], "|"));
Ответить с цитированием
  #8 (permalink)  
Старый 08.02.2020, 18:45
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Dark Souls,
Сообщение от Aetae
Строки попадающие в new RegExp должны быть экранированы.
c экранированием
String.prototype.str_replace_all = function(arRegexp, str) {
function escapeRegExp(string){
  return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
var expr = new RegExp(arRegexp.map(escapeRegExp).join("|"), "gi");
return this.replace(expr, str)
}
alert("one two three for five".str_replace_all(["two", "for"], "|"));
Ответить с цитированием
  #9 (permalink)  
Старый 08.02.2020, 19:38
Аспирант
Отправить личное сообщение для Dark Souls Посмотреть профиль Найти все сообщения от Dark Souls
 
Регистрация: 06.03.2017
Сообщений: 37

Спасибо
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в php не обновлять страницу, а изменить стиль? drkrol Серверные языки и технологии 1 17.09.2015 19:05
как передать php массивы через ajax Evsik AJAX и COMET 11 11.07.2015 06:32
Как работать с mssql с локального комьпютера в php EvgLuch Общие вопросы Javascript 1 30.01.2014 08:53
Как вставить PHP редирект в javascript 87464644764 Общие вопросы Javascript 1 23.07.2013 08:36
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48