Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:使用||_Javascript_Arrays_Reduce - Fatal编程技术网

Javascript:使用||

Javascript:使用||,javascript,arrays,reduce,Javascript,Arrays,Reduce,有人能解释一下下面的代码吗?inputWords应该是一个包含各种单词的数组,此函数应该返回一个数组,该数组包含单词在inputWords中出现的次数 ie.var inputWords=[“苹果”、“香蕉”、“苹果”、“榴莲”、“榴莲”、“榴莲”] console.log(countWords(inputWords)) // => // { // Apple: 2, // Banana: 1, // Durian: 3 // } 我理解Reduce函数的作用,但什么是res

有人能解释一下下面的代码吗?inputWords应该是一个包含各种单词的数组,此函数应该返回一个数组,该数组包含单词在inputWords中出现的次数

ie.var inputWords=[“苹果”、“香蕉”、“苹果”、“榴莲”、“榴莲”、“榴莲”]

console.log(countWords(inputWords))
// =>
// {
//   Apple: 2,
//   Banana: 1,
//   Durian: 3
// }
我理解Reduce函数的作用,但什么是resultObj[word]=++resultObj[word]| 1 非常感谢:)


它将
resultObj
中不存在的键“默认”为
1

Javascript的
|
实际上将返回比较中的第一个(最左边的)真实值,因此对于不存在的值,由preincrement操作符添加一个值,例如
++resultObj['banana']
返回
NaN
,这是错误的,
|
操作符将其替换为
1


编辑:请参见

代码尝试为一个键(可能尚未存在)分配一个递增值(可能尚未存在的键),如果该值为假,则分配一个1

这称为短路评估。给定
a=b | | c
,如果
b
是真实的,
c
永远不会得到评估,因此
a
采用
b
的值。如果
b
为假,则计算
c
并将其分配给
a
。在您的情况下,当密钥不存在时,
++resultObj[word]
是错误的

依我拙见,我认为如果他们改为:

if (word in resultObj) {
    ++resultObj[word];
}
else {
    resultObj[word] = 1;
}
甚至:

resultObj[word] = word in resultObj ? resultObj[word] + 1 : 1;
其中任何一个都可以省去你问这个问题的麻烦。

我会写:

resultObj[word] = (resultObj[word] || 0) + 1;

如果存在,则递增
resultObj[word]
,否则将其初始化为1。
|
是逻辑or运算符,如果左侧是falsy,则将选择1value@vladkras
reduce
实际上是应用函数将集合聚合为单个值的操作,在本例中,一个包含多个单词的数组指向一个对象,计算每个单词在数组中出现的次数。增量就是实际计算的内容。可以写成
resultObj[word]=(resultObj[word]| | 0)+1
,这样可以更好地理解意图。
resultObj[word] = (resultObj[word] || 0) + 1;