Javascript: как передать найденное значение string.replace в функцию? - PullRequest
3 голосов
/ 17 января 2011

Когда у меня что-то вроде этого:

var str = "0123";
var i = 0;
str.replace(/(\d)/g,function(s){i++;return s;}('$1'));
alert(i);

Почему «я» равно 1, а не 4? Кроме того, возможно ли передать действительное значение $ 1 в функцию (в данном случае 0,1,2,3)?

Ответы [ 3 ]

12 голосов
/ 17 января 2011

Когда вы используете string.replace(rx,function), тогда функция вызывается со следующими аргументами:

  • Соответствующая подстрока
  • Match1,2,3,4 и т. Д. (Совпадения подстроки в скобках)
  • Смещение подстроки
  • Полная строка

Вы можете прочитать все об этом здесь

В вашемcase $ 1 равен Match1, поэтому вы можете переписать свой код следующим образом, и он должен работать так, как вы хотите:

var str = "0123";
var i = 0;
str.replace(/(\d)/g,function(s,m1){i++;return m1;});
alert(i);
1 голос
/ 17 января 2011

Выражение

function(s){i++;return s;}('$1')

Создает функцию и немедленно оценивает ее, передавая $1 в качестве аргумента. Метод str.replace уже получает строку в качестве второго аргумента, а не функцию. Я верю, что вы хотите это:

str.replace(/(\d)/g,function(s){i++;return s;});
0 голосов
/ 17 января 2011

Вы вызываете функцию, которая увеличивает значение i один раз, а затем возвращает строку '$1'.

Чтобы передать значение в функцию, вы можете сделать:

str.replace(/\d/g, function (s) { /* do something with s */ });

Тем не менее, похоже, что вы на самом деле ничего не хотите заменять ... вы просто хотите подсчитать количество цифр. Если это так, то replace - неправильный инструмент. Попробуйте:

i = str.match(/\d/g).length;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...