#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 . Возможно, вам следует изменить его на ==