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