Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
function str_replace ( search, replace, subject ) { // Replace all occurrences of the search string with the replacement string
//
// + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + improved by: Gabriel Paderni
if(!(replace instanceof Array)){
replace=new Array(replace);
if(search instanceof Array){//If search is an array and replace is a string, then this replacement string is used for every value of search
while(search.length>replace.length){
replace[replace.length]=replace[0];
}
}
}
if(!(search instanceof Array))search=new Array(search);
while(search.length>replace.length){//If replace has fewer values than search , then an empty string is used for the rest of replacement values
replace[replace.length]='';
}
if(subject instanceof Array){//If subject is an array, then the search and replace is performed with every entry of subject , and the return value is an array as well.
for(k in subject){
subject[k]=str_replace(search,replace,subject[k]);
}
return subject;
}
for(var k=0; k<search.length; k++){
var i = subject.indexOf(search[k]);
while(i>-1){
subject = subject.replace(search[k], replace[k]);
i = subject.indexOf(search[k],i);
}
}
return subject;
}
function str_replace(search, replace, subject) { return subject.split(search).join(replace);}
А ничего, что оригинальная функция умеет немного больше? Как я вижу она умеет менять все "aa" -> "a" и все "bb" -> "b" за один проход. Или например умеет менять "aa", "ab" и "ac" в "a".
Поддерживает, но немного не так, как репласе - попробуйте регулярку со скобками, например.
И оригинал зачем-то принимает аргументами массивы, вы не пробовали строку массивом разбить?
Эта функция входит в состав phpjs и имитирует работу PHP-функции str_replace() (см. http://php.net/str_replace ). Последней на вход подаются три аргумента:
1) строка поиска или массив таких строк;
2) строка замены или массив таких строк, смежный с массивом строк поиска;
3) строка, в которой будет производиться замена (не изменяется).
Если идёт замена строки на строку, вариант с subject.split(search).join(replace) абсолютно верен. Если идёт замена по массиву - она происходит в несколько проходов, на каждом из которых происходит замена очередной подстроки очередной подстрокой (или одной и той же). Это значит, что str_replace(["a", "b", "c"], ["b", "c", "d"], "abcd") == "dddd" (итерации: "bcdd", "cddd", "dddd"), вариант с .split(search).join(replace) терпит FAIL.
Вывод:
1) не говнокод, а авторская задумка.
2) запостившему перед тем, как постить, надо разуть глаза и поинтересоваться, для чего нужно и как должно работать то, что он постит. Тем, кто повёлся - внимательнее раскуривать код.
Так-то.
функция говнистая только потому, что все то же самое можно сделать регекспом, и не нужно совать туда массив, это медленно и противоестесственно. Наличие такой говнистой сигнатуры в том же PHP или любом другом языке не делает ее ни капельки лучше.
В самом жестоком варианте, если, например, регексп по какой-то причине не поддерживается (ну 20 лет назад такое было кажется...), то, опять же, оптимальный вариант делать такие замены в один проход + FSM (что по сути и является имитацией того, что делает регексп), а никак ни черззаборногузадерические тучи циклов и split-join. Split-join плодит тучу строковых констант в пуле и поэтому сильно засоряет память виртуальной машины - виртуальная машина напрягается в смысле менеджмента памяти, врезультате имеем код, который кроме того, что работает медленно, еще и работает с очень разной скоростью, зависящей только от конкретного текущего состояния памяти делегированой виртуальной машине. (Усложняет профайлинг и определение участков программы критичных к производительности).
И оригинал зачем-то принимает аргументами массивы, вы не пробовали строку массивом разбить?
1) строка поиска или массив таких строк;
2) строка замены или массив таких строк, смежный с массивом строк поиска;
3) строка, в которой будет производиться замена (не изменяется).
Если идёт замена строки на строку, вариант с subject.split(search).join(replace) абсолютно верен. Если идёт замена по массиву - она происходит в несколько проходов, на каждом из которых происходит замена очередной подстроки очередной подстрокой (или одной и той же). Это значит, что str_replace(["a", "b", "c"], ["b", "c", "d"], "abcd") == "dddd" (итерации: "bcdd", "cddd", "dddd"), вариант с .split(search).join(replace) терпит FAIL.
Вывод:
1) не говнокод, а авторская задумка.
2) запостившему перед тем, как постить, надо разуть глаза и поинтересоваться, для чего нужно и как должно работать то, что он постит. Тем, кто повёлся - внимательнее раскуривать код.
Так-то.
В самом жестоком варианте, если, например, регексп по какой-то причине не поддерживается (ну 20 лет назад такое было кажется...), то, опять же, оптимальный вариант делать такие замены в один проход + FSM (что по сути и является имитацией того, что делает регексп), а никак ни черззаборногузадерические тучи циклов и split-join. Split-join плодит тучу строковых констант в пуле и поэтому сильно засоряет память виртуальной машины - виртуальная машина напрягается в смысле менеджмента памяти, врезультате имеем код, который кроме того, что работает медленно, еще и работает с очень разной скоростью, зависящей только от конкретного текущего состояния памяти делегированой виртуальной машине. (Усложняет профайлинг и определение участков программы критичных к производительности).