有人可以解释以下代码吗? inputWords应该是一个包含各种单词的数组,这个函数应该返回一个数组,其中包含一个单词在inputWords中出现的次数。
即。 var inputWords = [' Apple',' Banana'' Apple',' Durian',' Durian',& #39;榴莲']
console.log(countWords(inputWords))
// =>
// {
// Apple: 2,
// Banana: 1,
// Durian: 3
// }
我理解Reduce函数的功能,但是什么是 resultObj [word] = ++ resultObj [word] || 1; 在做什么?
非常感谢:)
function countWords(inputWords) {
return inputWords.reduce(function(resultObj, word) {
resultObj[word] = ++resultObj[word] || 1;
return resultObj;
}, {});
}
module.exports = countWords;
答案 0 :(得分:3)
代码尝试分配一个密钥(可能尚不存在)一个递增的值(可能尚不存在的密钥),如果它是 falsey ,它会分配一个1。
这称为短路评估。给定a = b || c
,如果b
truthy ,则c
永远不会被评估,因此a
会占用b
的值。如果b
falsey ,则评估c
并将其分配给a
。在您的情况下,当密钥不存在时,++resultObj[word]
是假的。
在我的拙见中,我认为如果他们做了以下事情就会更清楚地说明作者的意图:
if (word in resultObj) {
++resultObj[word];
}
else {
resultObj[word] = 1;
}
甚至:
resultObj[word] = word in resultObj ? resultObj[word] + 1 : 1;
其中任何一个都可以让你省心问这个问题。
答案 1 :(得分:1)
这是resultObj
到1
中不存在的密钥的“默认”。
Javascript的||
实际上会从比较中返回第一个(最左边)的truthy值,因此对于非增量值,由preincrement运算符(例如++resultObj['banana']
)添加的值返回NaN
,是假的,||
运算符会将其替换为1
。
修改:请参阅http://nfriedly.com/techblog/2009/07/advanced-javascript-operators-and-truthy-falsy/
答案 2 :(得分:1)
我会写:
resultObj[word] = (resultObj[word] || 0) + 1;