Javascript:使用||
有人能解释一下下面的代码吗?inputWords应该是一个包含各种单词的数组,此函数应该返回一个数组,该数组包含单词在inputWords中出现的次数 ie.var inputWords=[“苹果”、“香蕉”、“苹果”、“榴莲”、“榴莲”、“榴莲”]Javascript:使用||,javascript,arrays,reduce,Javascript,Arrays,Reduce,有人能解释一下下面的代码吗?inputWords应该是一个包含各种单词的数组,此函数应该返回一个数组,该数组包含单词在inputWords中出现的次数 ie.var inputWords=[“苹果”、“香蕉”、“苹果”、“榴莲”、“榴莲”、“榴莲”] console.log(countWords(inputWords)) // => // { // Apple: 2, // Banana: 1, // Durian: 3 // } 我理解Reduce函数的作用,但什么是res
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@vladkrasreduce
实际上是应用函数将集合聚合为单个值的操作,在本例中,一个包含多个单词的数组指向一个对象,计算每个单词在数组中出现的次数。增量就是实际计算的内容。可以写成resultObj[word]=(resultObj[word]| | 0)+1
,这样可以更好地理解意图。
resultObj[word] = (resultObj[word] || 0) + 1;