Skip to content

Instantly share code, notes, and snippets.

@dmjcomdem
Created September 3, 2017 10:26
Show Gist options
  • Save dmjcomdem/cf920f22878d6767f08ff5914c62911c to your computer and use it in GitHub Desktop.
Save dmjcomdem/cf920f22878d6767f08ff5914c62911c to your computer and use it in GitHub Desktop.
let a = 'xxx-xxx-xxx xx'.replace(/x/g, (n=>s=>x=>s[n++])(0)('92795008123'.replace(/\D/g,'')));
console.log(a); // 927-950-081 23
// видно, что (0)('92795008123'.replace(/\D/g,'') - это вызов функции типа нашей add(1)(2)
// '92795008123'.replace(/\D/g,'' - тут просто замена не цифр (\D) на '', то есть оставление только цифр
// вообще говоря имеет смысл только когда '92795008123' приходит из внешнего кода
// перепишем (n=>s=>x=>s[n++]) на стандартные function:
function repl(n) { // 1) n = 0 - индекс в строке s
return function (s) { // 2) s = '92795008123' - форматируемая строка
return function (x) { // 3) x - очередное найденное совпадение с 'x' в строке 'xxx-xxx-xxx xx'
return s[n++]; // 4) n - индекс, s-массив
}
}
}
// проверяем
let b = 'xXx-xxx-xxx xx'.replace(/x/ig, repl(0)('92795008123'.replace(/\D/g,'')));
console.log(b); // 927-950-081 23
/*
Вроде работает. Думаем почему.
Вообще говоря строчка 3) - есть функция, которую и ожидает str.replace(reg, str|func).
У этой ф-ии в простом варианте три параметра func(str, offset, исходная_строка).
Нас интересует только первый параметр str - найденное совпадение.
Эта ф-ия вызывается столько раз, сколько нашли 'x' в строке 'xxx-xxx-xxx xx'
И используя s[n++] мы просто как-бы скользим по '92795008123', выдавая цифру за цифрой
И получается обёртки двух ф-ий сверху 1) и 2) нужны только для того, чтобы через замыкание передать
начальный индекс в строке (n=0) и саму строку s='92795008123.
Теперь становится ясен смысл вызова: (0)('92795008123'.replace(/\D/g,'')
(0) - это индекс n в строке s
('92795008123'.replace(/\D/g,'') = '92795008123' - это строка s
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment