如何在JavaScript中进行countBy

316 阅读1分钟

countBy函数是人们在其JavaScript代码库中使用Lodash的原因之一。在这里,我想给你一个简单的例子,说明如何在没有Lodash的情况下,通过使用JavaScript的reduce方法,在vanilla JavaScript中实现countBy。

假设我们有以下的对象数组,我们想通过属性(这里是颜色)来计算它们,得到以下输出:

const users = [
  { name: 'Jim', color: 'blue' },
  { name: 'Sam', color: 'blue' },
  { name: 'Eddie', color: 'green' },
];

const countByColor = // TODO: implement countBy

console.log(countByColor);

// { blue: 2, green: 1 }

我们可以在一个数组上使用JavaScript的reduce方法来遍历每一个项目:

const countByColor = users.reduce((acc, value) => {
  // TODO: implement countBy

  return acc;
}, {});

我们从一个空对象开始,作为这个reduce的回调函数的累积器(这里是acc )。对于该函数的每一次迭代,我们都会返回改变后的(这里仍然没有改变)累加器。让我们来实现countBy:

const usersByColor = users.reduce((acc, value) => {
  if (!acc[value.color]) {
    acc[value.color] = 1;
  } else {
    acc[value.color]++;
  }

  return acc;
}, {});

如果累加器没有为当前迭代值的颜色初始化计数,我们就用对象中分配的1的计数初始化它,而颜色是关键。如果有一个计数,我们可以用++运算符将其增加1。

本质上,我们从一个空对象开始,对于每一个迭代的值,我们协商是否需要根据这个对象中的属性(这里是颜色)分配一个新的1的计数。如果不需要,我们就将计数增加1,因为我们已经开始计数了。