Попытка понять логику троичного условия в этом примере - PullRequest
3 голосов
/ 27 марта 2019

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

["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, в противном случае возвращают 0, аналогично системе подсчета очков в футбольном матче.

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

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

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

Ответы [ 5 ]

2 голосов
/ 27 марта 2019

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

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

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

2 + (false);

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

2 + 0

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

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

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

2 + 1;
2 голосов
/ 27 марта 2019

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

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

console.log('hi' == 'hi');  // true
console.log(0 + (true));  // 1
console.log(0 + ('hi' == 'hi'));  // 1
2 голосов
/ 27 марта 2019

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

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

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

console.log(x);
console.log(_);
console.log(y);
1 голос
/ 27 марта 2019

Вот сеанс узла для изучения.Во-первых, он показывает современную деструктуризацию строки в массив 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» подвергается деструктуризации строки в массив,что приводит к х = 2, у = 2.Следовательно, x == y является логическим значением true.Теперь в теле функции есть + (... x == y), поэтому истинное значение (иначе x == y) преобразуется в числовое значение 1 благодаря оператору + (плюс).Итак, возвращается одна точка.

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

1 голос
/ 27 марта 2019

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

Таким образом, вы можете деструктировать строки.

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);
...