JavaScript 计算属性

JavaScript computed properties

我正在学习 James Moore 的 JavaScript 初学者函数式编程课程。但是,我目前在理解以下代码时遇到困难:

const reviews = [4.5, 4.0, 5.0, 2.0, 1.0, 5.0, 3.0, 4.0, 1.0, 5.0, 4.5, 3.0, 2.5, 2.0];

const countGroupedByReview = reviews.reduce(groupBy, {});

function groupBy (acc, review){
  const count = acc[review] || 0;
  return {...acc, [review]: count + 1}
}

虽然我了解 reduce 方法的工作方式,但我很难理解 groupBy 功能块中的代码。我相信这与计算的 属性 名称有关。如果有任何帮助,我将不胜感激。

谢谢。

它认为代码块中没有任何计算的 属性 名称。此代码块的作用是计算数组中每个评论分数的出现次数。让我们先逐步了解回调及其参数:

回调接受 2 个参数:

  • acc是accumulator,就是reducer会一直往里推的数据。它首先被定义为一个空白对象,作为Array.prototype.reduce
  • 中的第二个参数
  • review 只是数组中当前正在迭代的当前项

现在进入回调本身的代码。 const count = acc[review] || 0 行的意思是:

  1. 如果数组项作为键存在于累加器中,则return它的值
  2. 如果数组项不作为键存在于累加器中,则将其值设置为 0

之后,您只需将计数加 1,因为您刚刚遇到该项目,并且您希望将其添加到总计数中,按数组项目的值分组。 { ...acc, [review]: count + 1 } 只是一个对象传播函数,它只是意味着:保留我为累加器拥有的任何键值对,但合并对特定键值对所做的更改。

{...acc, [review]: count + 1}

在这里它扩展了 acc 并且对于当前元素它添加 1 到先前的计数,

[1,3,3]

例如,当您在第一个元素上遍历此数组时,即 1 groupBy 将 return 一个对象,如

{ 1: 1 }

现在在第二次迭代中当前元素是 3 所以 groupBy 将传播前一个对象并且因为 3 之前没有出现所以 count = 0, return 值的 groupBy 将是

{ 1: 1, 3: 1}

现在在第三次迭代中,当前元素是 3,因此 groupBy 将展开前一个 returned 对象,并为键 3 添加 1,因此它 returns

{ 1: 1, 3: 2}


一个简单的版本可以是这样的

const reviews = [4.5, 4.0, 5.0, 2.0, 1.0, 5.0, 3.0, 4.0, 1.0, 5.0, 4.5, 3.0, 2.5, 2.0];

const countGroupedByReview = reviews.reduce(groupBy, {});

function groupBy(acc, review) {
  acc[review] = acc[review] || 0;
  acc[review]++
  return acc
}

console.log(countGroupedByReview)