我有以下对象数组
const users = [
{ name: 'Bob Johnson', occupation: 'Developer' },
{ name: 'Joe Davidson', occupation: 'QA Tester' },
{ name: 'Kat Matthews', occupation: 'Developer' },
{ name: 'Ash Lawrence', occupation: 'Developer' },
{ name: 'Jim Powers', occupation: 'Project Manager}]
Run Code Online (Sandbox Code Playgroud)
我想创建一个对象来存储不同类型的唯一计数occupations,就像这样
{ developerCount: 3, qaTesterCount: 1, projectManagerCount: 1 }
Run Code Online (Sandbox Code Playgroud)
我目前的解决方案是这个漫长而长大的方法
let occupationCounts = {
developerCount: 0,
qaTesterCount: 0,
projectManagerCount: 0
}
// Loop through the array and count the properties
users.forEach((user) => {
switch(user.occupation){
case 'Developer':
occupationCounts.developerCount++;
break;
// and so on for each occupation
}
});
Run Code Online (Sandbox Code Playgroud)
这种方法只会增加occupation我必须添加的每种新类型.
有一个更简单的解决方案吗?(纯javascript或Lodash Wizardry)
任何输入都表示赞赏!
Array.prototype.reduce 应该在这里提供帮助,只要你不拘泥于具体的计数名称:
const users = [
{ name: 'Bob Johnson', occupation: 'Developer' },
{ name: 'Joe Davidson', occupation: 'QA Tester' },
{ name: 'Kat Matthews', occupation: 'Developer' },
{ name: 'Ash Lawrence', occupation: 'Developer' },
{ name: 'Jim Powers', occupation: 'Project Manager'}
]
const counts = users.reduce((counts, {occupation}) => {
counts[occupation] = (counts[occupation] || 0) + 1;
return counts
}, {})
console.log(counts)Run Code Online (Sandbox Code Playgroud)
虽然你可以做些什么来改变这些名字,但除非真的很重要,否则我不会打扰.
编辑
如果你真的想要那些,你可以得到这样的东西:
const key = occupation[0].toLowerCase() +
occupation.slice(1).replace(/\s/g, '') + 'Count'
counts[key] = (counts[key] || 0) + 1;
Run Code Online (Sandbox Code Playgroud)
但即使这样也会生成"q A TesterCount"而不是"q a TesterCount".一般来说,走得更远是一个真正的挑战.
| 归档时间: |
|
| 查看次数: |
52 次 |
| 最近记录: |