【问题标题】:Trying to understand ternary condition logic in this example在这个例子中试图理解三元条件逻辑
【发布时间】:2019-08-17 11:40:09
【问题描述】:

我正在编写代码 kata,其中涉及获取一系列足球比分,例如

["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)

为了澄清,规则是,如果第一个值大于第二个返回 3,如果相等返回 1,否则返回 0,类似于足球比赛计分系统。

在这种情况下“x == y”部分如何工作,这里的规则是如果“x == y”则应返回一个点。

如果有人可以用一个简单的例子来解释这一点,那将对我有帮助,谢谢。

附带说明,如果有人可以解释“[x, _, y]”,我也将不胜感激。我知道它应该代表数组中的当前项,但是当前项是一个字符串,而不是数组,那么这里发生了什么?

【问题讨论】:

  • 分数“1:3”返回什么值?
  • 用规则信息更新帖子。
  • 我认为这是你的减速器const reducer = (a, [x, _ , y]) => a + (x > y) ? 3 : x == y 而不是你的问题

标签: javascript arrays ecmascript-6 reduce


【解决方案1】:

它正在解构字符串

x 是第一个字符,_ 是未使用的变量,y 是第三个;

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

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

【讨论】:

  • 感谢您回答这部分问题,我听说过数组和对象解构,但不知道同样适用于字符串。
  • 字符串就像一个字符数组。
【解决方案2】:

这归结为 JavaScript 如何解释真假。在控制台中尝试以下操作:

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;

【讨论】:

  • 接受逐步布局
【解决方案3】:

这只是 JavaScript 的一个古怪的类型强制副作用。

true 在算术运算中像这样使用时可以强制转换为1

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

【讨论】:

    【解决方案4】:

    字符串值是一种带有索引的数组(可迭代对象),因此您可以访问索引:

    所以,你可以解构字符串。

    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 -> 1false -> 0

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

    【讨论】:

    • 我不认为关于true === 1 的说法是完全正确的。 === 也检查类型,因此表达式返回 false。也许你应该把它改成 ==
    【解决方案5】:

    这是一个节点会话供您学习。首先它展示了现代 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 是布尔真。现在,函数体中有一个 + (... x==y),因此由于 +(加号)运算符,真值(又名 x==y)被转换为数字 1 值。因此,返回一个点。

    问候,M.

    【讨论】:

    • 对不起,在我写包含节点会话的答案时,已经发布了很多好的分析器。不是为了给任何人上学。问候。 M.
    猜你喜欢
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多