0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 41
1

Как работает код?

06.08.2017, 21:12. Показов 476. Ответов 6
Метки нет (Все метки)

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
'use strict';
 
let messages = {
  "Hello, {0}!": "Привет, {0}!"
};
 
function i18n(strings, ...values) {
  // По форме строки получим шаблон для поиска в messages
  // На месте каждого из значений будет его номер: {0}, {1}, …
  let pattern = "";
  for(let i=0; i<values.length; i++) {
    pattern += strings[i] + '{' + i + '}';
  }
  pattern += strings[strings.length-1];
  // Теперь pattern = "Hello, {0}!"
 
  let translated = messages[pattern]; // "Привет, {0}!"
 
  // Заменит в "Привет, {0}" цифры вида {num} на values[num]
  return translated.replace(/\{(\d)\}/g, (s, num) => values[num]);
}
 
// Пример использования
let name = "Вася";
 
// Перевести строку
alert( i18n`Hello, ${name}!` ); // Привет, Вася!
Не пойму как работает код в этой строке:

return translated.replace(/\{(\d)\}/g, (s, num) => values[num]);

{0} заменяется на функцию и функция воспроизводится, но что за параметры "s" и "num", откуда они берутся?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.08.2017, 21:12
Ответы с готовыми решениями:

Код работает, но не так как надо
Здравствуйте. Нужно, чтобы строка поиска увеличивалась в длине от 0px до 130px при нажатии...

Простейший код работает в MS IE, почему не работает в Mozilla, FireFox?
Приветствую. Вот собственно код: &lt;html&gt; &lt;head&gt;&lt;/head&gt; &lt;body&gt; &lt;input type=&quot;button&quot;...

не работает код (очень простой код!)
&lt;!doctype html&gt; &lt;html lang=&quot;en&quot;&gt; &lt;head&gt; &lt;meta charset=&quot;utf-8&quot;&gt; &lt;title&gt; Just a generic...

Не работает код js, почему ? Код внутри
Короче есть форма и js файлик с функциями, ф-я при клике проверяет написано ли там 'Введите имя',...

6
Эксперт PHP
4811 / 3827 / 1593
Регистрация: 24.04.2014
Сообщений: 11,236
06.08.2017, 21:22 2
https://learn.javascript.ru/re... g-str-func
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 41
07.08.2017, 10:24  [ТС] 3
Мне не понятно откуда берутся s и num
0
Эксперт JS
2393 / 1707 / 617
Регистрация: 11.07.2016
Сообщений: 3,945
07.08.2017, 10:40 4
Функция, переданная в качестве второго аргумента методу String.prototype.replace() получает от 3х до 4х аргументов (в зависимости от наличия скобок в регулярном выражении). В вашем случае в аргумент s будет записано найденное совпадение, а в аргумент num - позиция, на которой было найдено совпадение. Если вы добавите туда третий аргумент, то в нём будет содержаться исходная строка.
0
the hardway first
Эксперт JS
2421 / 1806 / 894
Регистрация: 05.06.2015
Сообщений: 3,569
07.08.2017, 11:08 5
Цитата Сообщение от Ilikeit Посмотреть сообщение
Javascript
1
alert( i18n`Hello, ${name}!` );
Для начала надо понимать, как работает Tagged Template.

Например, при вызове функции таким образом func`interpolated string with ${computedValue1} and ${computedValue2}.` можете представить, что вызывается эта функция так: func(['interpalated string with ', ' and ', '.'], computedValue1, computedValue2); То есть строка, разбитая на массив в тех местах, где должны быть вычисленные значения, и сами вычисленные значения.

Следовательно сигнатура функции должна быть такая:
Javascript
1
function func(parts, ...values) { /* impementation */}
И с этими массивами вы можете поступать по своему усмотрению:
Javascript
1
2
3
4
5
6
function func(parts, ...values) {
  console.log(parts[0], values[0]);
  console.log(parts[1]);
  return parts[0] + values[0] + parts[1];
}
console.log(func `interpolated string with ${'4' + '2'}.`);
С этим разобрались. Дальше. Словарь представлен вида:
Javascript
1
2
3
let ruRU = {
  'interpolated string with {0}.': 'интерпретируемя строка с {0}.'
}
То есть надо полученный массив ['interpolated string with ', '.'] преобразовать с строку 'interpolated string with {0}.'. Чем и занимается этот кусок кода:
Javascript
1
2
3
4
5
  let pattern = "";
  for(let i=0; i<values.length; i++) {
    pattern += strings[i] + '{' + i + '}';
  }
  pattern += strings[strings.length-1];
Дальше из словаря берётся значение по полученному ключу. И на этом значении вызывается функция string.replace(), в параметрах которой указывается что искать, и на что менять. Вот во втором параметре можно указать функцию, чтобы можно было вычислить значение, на которое надо поменять найденный шаблон. Эта функция вызывается с параметрами: сопоставившаяся подстрока, n-ная сопоставившаяся подгруппа из объекта RegExp.

То есть в примере выше translated.replace(/\{(\d)\}/g, (s, num) => values[num]); анонимная функция будет вызвана с параметрами: '{0}' и '0'. И найденная строка {0} заменяется на значение из values по индексу, который соответствует подгруппе (\d) из объекта RegExp /\{(\d)\}/g.
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
let ruRU = {
  'interpolated string with {0}.': 'интерпретируемя строка с {0}.'
}
 
function func(parts, ...values) {
  // let pattern = values
  //   .map((v, i) => {
  //     return `${parts[i]}{${i}}`
  //   })
  //   .concat([parts[parts.length - 1]])
  //   .join('');
  let pattern = "";
  for (let i = 0; i < values.length; i++) {
    pattern += parts[i] + '{' + i + '}';
  }
  pattern += parts[parts.length - 1];
 
  let translated = ruRU[pattern];
  return translated.replace(/\{(\d)\}/g, function(s, num) {
    return values[parseInt(num, 10)];
  });
}
 
console.log(func `interpolated string with ${'4' + '2'}.`);
Добавлено через 8 минут
Ах да, если вас интересовал лишь .replace() вот пример, может понятнее будет
Javascript
1
2
3
4
5
6
7
8
9
var messages = {
  'a': 'this is a',
  'b': ' this is b'
}
 
var str = 'what is it? {a}';
console.log(str.replace(/\{(\w)\}/g, function(_, k) {
  return messages[k];
})); // => "what is it? this is a"
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 41
09.08.2017, 07:54  [ТС] 6
Как находится это совпадение? Откуда?
0
Эксперт JS
2393 / 1707 / 617
Регистрация: 11.07.2016
Сообщений: 3,945
09.08.2017, 09:50 7
Почитайте про регулярные выражения.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.08.2017, 09:50
Помогаю со студенческими работами здесь

Выбор элемента по атрибуту data-number, код есть, не могу понять почему не работает как нужно!
Всем привет! Товарищи, помогите, столкнулся с проблемой. У меня есть map в котором лежат area, у...

код в HTML работает, но не работает в JavaScript
Вот куски кода... &lt;input type=&quot;checkbox&quot; name=&quot;installation_n&quot; onclick=&quot;nast()&quot;/&gt;Наш монтаж&lt;br&gt; ...

Как проверить подключен ли javascript или у меня другая ошибка,у меня на сайте этот код не работает
&lt;p&gt; &lt;select name=&quot;id_mon&quot; id=&quot;select_mon&quot;&gt; &lt;?php $result =...

Как работает данный код? Почему в качестве параметра передана функция без скобок?
function ask (yes) { yes(); } function showOk () { alert( &quot;Вы согласились.&quot; ); } ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru