Created
September 3, 2017 10:26
-
-
Save dmjcomdem/cf920f22878d6767f08ff5914c62911c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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