1. JavaScript / Говнокод #2843

    +152.6

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    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);}

    Запостил: DrFreez, 22 Марта 2010

    Комментарии (7) RSS

    • Да, да, как раз недавно находил эти обе функции.
      Ответить
    • Оно еще и Improved!
      Ответить
    • А ничего, что оригинальная функция умеет немного больше? Как я вижу она умеет менять все "aa" -> "a" и все "bb" -> "b" за один проход. Или например умеет менять "aa", "ab" и "ac" в "a".
      Ответить
      • а ничего что split поддерживает регулярки?
        Ответить
        • Поддерживает, но немного не так, как репласе - попробуйте регулярку со скобками, например.
          И оригинал зачем-то принимает аргументами массивы, вы не пробовали строку массивом разбить?
          Ответить
    • Эта функция входит в состав 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 плодит тучу строковых констант в пуле и поэтому сильно засоряет память виртуальной машины - виртуальная машина напрягается в смысле менеджмента памяти, врезультате имеем код, который кроме того, что работает медленно, еще и работает с очень разной скоростью, зависящей только от конкретного текущего состояния памяти делегированой виртуальной машине. (Усложняет профайлинг и определение участков программы критичных к производительности).
      Ответить

    Добавить комментарий