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,因为我们已经开始计数了。