Пытаюсь понять логику троичных условий в этом примере

#javascript #arrays #ecmascript-6 #reduce

#javascript #массивы #ecmascript-6 #уменьшить

Вопрос:

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

 ["3:1", "2:2"]   (Total points here would be 4, 3   1)
  

и применяю некоторые правила, а затем суммирую пункты. Одним из решений было:

 const points = g => g.reduce((a, [x, _, y]) => a   (x > y ? 3 : x == y), 0)
  

Чтобы пояснить, правила таковы: если 1-е значение больше 2-го, возвращайте 3, если равно 1, в противном случае возвращайте 0, аналогично системе подсчета очков в футбольном матче.

Как работает часть «x == y» в этом случае, правило здесь таково, что если «x == y», то должна быть возвращена единственная точка.

Если кто-нибудь может объяснить это простым способом на примере, это помогло бы мне, спасибо.

Кстати, если кто-нибудь может объяснить «[x, _, y]», я также был бы признателен за это. Я понимаю, что он должен представлять текущий элемент в массиве, но текущий элемент является строкой, а не массивом, так что же здесь происходит?

Комментарии:

1. Какое значение возвращается для счета «1: 3»?

2. Обновлено сообщение с информацией о правиле.

3. Я думаю, что это ваш редуктор const reducer = (a, [x, _ , y]) => a (x > y) ? 3 : x == y , а не как в вашем вопросе

Ответ №1:

Это сводится к тому, как JavaScript интерпретирует true и false. Попробуйте в консоли следующее:

 let x = 1;
let y = 2;
2   (x == y);
  

Чего мы здесь ожидаем? x == y вычисляется как false , так что последняя строка действительно:

 2   (false);
  

Затем, чтобы разрешить сложение, оно преобразует это false в число. В JavaScript false равно 0. Так что на самом деле это:

 2   0
  

Теперь попробуйте это:

 let x = 1;
let y = 1;
2   (x == y);
  

И чего мы теперь ожидаем? Поскольку x == y теперь будет вычисляться как true, а true будет преобразовано в 1, это на самом деле:

 2   1;
  

Комментарии:

1. Принятие пошагового макета

Ответ №2:

Это разрушает строку

x — первый символ, _ — неиспользуемая переменная, а y — третий;

 const [x, _, y] = "3:1";

console.log(x);
console.log(_);
console.log(y);  

Комментарии:

1. Спасибо за ответ на эту часть вопроса, я слышал о деструктурировании массивов и объектов, но не знал, что то же самое может применяться к строкам.

2. Строки действуют как массив символов.

Ответ №3:

Это просто необычный побочный эффект JavaScript, связанный с принудительным вводом типов.

true может быть приведено к 1 при использовании подобным образом в арифметической операции:

 console.log('hi' == 'hi');  // true
console.log(0   (true));  // 1
console.log(0   ('hi' == 'hi'));  // 1  

Ответ №4:

Вот сеанс узла, который вы можете изучить. Во-первых, это показывает современную деструкцию JS из строки в массив, во-вторых, это показывает некоторое логическое поведение.

 micha@linux-micha: ~
$ node
> [...arr] = "hello";
'hello'
> [...arr]
[ 'h', 'e', 'l', 'l', 'o' ]
> [x, dummy, y] = "3:2"
'3:2'
> x
'3'
> y
'2'
> dummy
':'
> typeof (x == y)
'boolean'
> typeof true
'boolean'
> typeof false
'boolean'
> 1   true
2
> 1   false
1
>
  

Как вы можете видеть из сеанса этого узла, «2: 2» подвергается деструктурированию из строки в массив, что приводит к x = 2, y = 2. Следовательно,x==y имеет логическое значение true. Теперь в теле функции есть (… x ==y), поэтому истинное значение (иначе x ==y) преобразуется в числовое значение 1 благодаря оператору (плюс). Итак, возвращается единственная точка.

С уважением, M.

Комментарии:

1. Извините, уже было опубликовано так много хороших ответов, пока я писал свой ответ, содержащий сеанс узла. Не предназначался для обучения кого-либо. С уважением. M.

Ответ №5:

Строковые значения представляют собой своего рода массивы (итерируемые) с индексами, поэтому вы можете получить доступ к индексам:

Итак, вы можете разрушать строки.

 console.log("3:1"[0]);
console.log("3:1"[1]);
console.log("3:1"[2]);  
 .as-console-wrapper { max-height: 100% !important; top: 0; }  

В вашем случае это получение первого, второго и третьего индексов [x, _, y]

 let [x, _, y] = "3:1";
console.log(x, _, y);  

Это a (x == y) называется принуждением, true -> 1 и false -> 0 .

 console.log(1   false);
console.log(1   true);  

Комментарии:

1. Я не думаю, что часть о true === 1 совершенно верна. === также проверяет тип, так что выражение возвращает false . Возможно, вам следует изменить его на ==