Javascript:使用||减少功能

时间:2014-06-02 18:13:39

标签: javascript arrays reduce

有人可以解释以下代码吗? 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;

3 个答案:

答案 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)

这是resultObj1中不存在的密钥的“默认”。

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;
相关问题