【问题标题】:Javascript: Reduce function with ||Javascript:使用 || 减少函数
【发布时间】:2023-03-09 15:51:01
【问题描述】:

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

即。 var inputWords = ['Apple', 'Banana', 'Apple', 'Durian', 'Durian', 'Durian']

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;

【问题讨论】:

  • 如果存在则增加resultObj[word],否则将其初始化为1。
  • || 是逻辑或运算符,如果左边是假值,将选择 1
  • @vladkras reduce 实际上是应用一个函数将集合聚合为单个值的操作,在这种情况下,一个包含多个单词的数组到一个对象计算每个单词出现在大批。增量是实际计数。
  • 也可以写成resultObj[word] = (resultObj[word] || 0) + 1,这样可以更好地表达意图。

标签: javascript arrays reduce


【解决方案1】:

代码尝试为键(可能尚不存在)分配一个递增值(可能尚不存在的键),如果它是 falsey,它会分配一个1.

这称为短路评估。给定a = b || c,如果btruthy,则c 永远不会被评估,所以a 采用b 的值。如果bfalsey,则评估c 并将其分配给a。在您的情况下,当密钥不存在时,++resultObj[word] 是错误的。

以我的拙见,我认为如果他们这样做的话,会更清楚地说明作者的意图:

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

甚至:

resultObj[word] = word in resultObj ? resultObj[word] + 1 : 1;

其中任何一个都可以省去你问这个问题的麻烦。

【讨论】:

    【解决方案2】:

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

    Javascript 的|| 实际上会从比较中返回第一个(最左边的)真值,所以对于一个不存在的值,如++resultObj['banana'] 之类的预增量运算符添加一个返回NaN,这是错误的,而@ 987654327@ 运算符将用1 替换它。

    编辑:见http://nfriedly.com/techblog/2009/07/advanced-javascript-operators-and-truthy-falsy/

    【讨论】:

      【解决方案3】:

      我会写:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-31
        • 2022-08-15
        • 2017-10-19
        • 2018-12-03
        • 1970-01-01
        • 2020-05-13
        • 2011-06-06
        • 2015-07-14
        相关资源
        最近更新 更多