在此示例中尝试理解三元条件逻辑

时间:2019-03-27 00:39:37

标签: javascript arrays ecmascript-6 reduce

我正在做一个代码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]”,我也将不胜感激。我了解它应该表示数组中的当前项目,但是当前项目是字符串,而不是数组,所以这里发生了什么?

5 个答案:

答案 0 :(得分:2)

它正在破坏字符串

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

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

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

答案 1 :(得分: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;

答案 2 :(得分:2)

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

在算术运算中使用

true可以强制使用1

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

这是供您学习的节点会话。首先,它显示了现代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),因此,由于+(加号)运算符,真实值(aka x == y)转换为数值1。因此,将返回一个点。

M。