Как лучше организовать методы последовательной замены в JavaScript? - PullRequest
0 голосов
/ 18 декабря 2011

У меня есть последовательность методов замены, включая регулярные выражения.Все они составлены так:

motivation = motivation.replace('death','life').replace('sad','happy').replace(/fu+ck/gi,'yay!').replace('darkness','light');

Есть ли способ организовать это, чтобы сделать его более читабельным?Не нужно повторять «заменить» все время было бы хорошим началом.У меня также есть доступ к библиотеке Mootools.

Ответы [ 3 ]

2 голосов
/ 18 декабря 2011

Вот самая простая вещь, о которой я могу подумать: умный отступ.

motivation = motivation.replace('death','life')
   .replace('sad','happy')
   .replace(/fu+ck/gi,'yay!')
   .replace('darkness','light');

Другой вариант - просто использовать что-то вроде Array.each (я думаю, это в Mootools):

Array.each([['death', 'life'],['sad', 'happy'],[/fu+ck/gi, 'yay!'],
            ['darkness', 'light']],
    function (pair) { motivation = motivation.replace(pair[0], pair[1]); });

Это действительно имеет смысл только для очень длинных списков замен.

1 голос
/ 18 декабря 2011

Вы можете добавить разрывы строк.

motivation = motivation
             .replace('death','life')
             .replace('sad','happy')
             .replace(/fu+ck/gi,'yay!')
             .replace('darkness','light');

Кроме этого - если вы не измените весь подход - нет, я не вижу, как его улучшить.

Изменение подхода может означать что-то вроде этого:

function replaceMany(s /*, [search, replace], ... */) {
  for (var i=1, l=arguments.length; i<l; i++) {
    s = s.replace(arguments[i][0], arguments[i][1]); 
  }
  return s;
}

Тогда вы могли бы назвать это как:

var motivation = replaceMany(
  motivation, 
  ['death','life'], ['sad','happy'], [/fu+ck/gi,'yay!'], ['darkness','light']
);

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

0 голосов
/ 18 декабря 2011

Я не нахожу оригинал нечитабельным, особенно если вы добавляете некоторые разрывы строк, как подсказывают другие ответы. Так что я бы сделал именно то, что сказали Томалак и Тихон.

Но если вы действительно хотите избежать повторения .replace все время, вы можете создать функцию, которая принимает массив текста поиска / замены:

function replaceMany(str, replacements) {
   for (var i=0; i<replacements.length; i+++)
      str = str.replace(replacements[i][0], replacements[i][1]);
   return str;
}

motivation = replaceMany(motivation, [ ['death','life'],
                                       ['sad','happy'],
                                       [/fu+ck/gi,'yay!'],
                                       ['darkness','light'] ]);

Очевидно, я решил сделать параметр replacements массивом, в котором каждый элемент представляет собой двухэлементный массив с текстом для поиска (или регулярным выражением) и соответствующим текстом для замены.

Я действительно не рекомендую возиться со встроенными прототипами объектов, но если вы тот, кто это делает, то:

String.prototype.replaceMany = function(replacements) {
   var str = this;
   for (var i=0; i<replacements.length; i+++)
      str = str.replace(replacements[i][0], replacements[i][1]);
   return str;
}

motivations = motivations.replaceMany([/*array as above*/]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...