javascript - 使用lodash在javascript中的对象数组中按值计数
问题描述
我有一个对象数组,如下所示:
var input_array = [{
role_name: 'Full Stack Developer',
position_id: 'b0f00e68-5adc-4209-aec2-9c4962550ab1',
email_address: 'abc.recruiter@gmail.com',
application_id: '1dd45634-c283-4a96-a28a-d8a63c418329',
state: 'qualified',
closing_date: '2018-10-28 06:30:00' },
{
role_name: 'Delivery Representative',
position_id: '090276f0-3fca-4b2a-85ed-697d21c405a0',
email_address: 'abc.recruiter@gmail.com',
application_id: 'aa7fe2dd-b141-4c64-8350-a1d57bfaa502',
state: 'interview',
closing_date: '2018-10-28 06:30:00' },
{
role_name: 'Delivery Representative',
position_id: '12345678-5adc-4209-aec2-9c4962550ab1',
email_address: 'xyz.recruiter@gmail.com',
application_id: '166da0ac-aaf1-400d-9a62-e37962f66653',
state: 'interview',
closing_date: '2018-10-28 06:30:00' },
{
role_name: 'Delivery Representative',
position_id: '090276f0-3fca-4b2a-85ed-697d21c405a0',
email_address: 'abc.recruiter@gmail.com',
application_id: 'da09a617-8e82-43c0-b1ea-725110a2c4cb',
state: 'interview',
closing_date: '2018-10-28 06:30:00' },
{
role_name: 'Delivery Representative',
position_id: '12345678-5adc-4209-aec2-9c4962550ab1',
email_address: 'xyz.recruiter@gmail.com',
application_id: '1d55a51a-ecd1-43ea-9cf4-fed101dbebda',
state: 'offer',
closing_date: '2018-10-28 06:30:00' },
{
role_name: 'Micro Space Planner',
position_id: 'fe30930f-7d9f-4953-8939-6d9924462b2b',
email_address: 'abc.recruiter@gmail.com',
application_id: '293bd084-64f0-4c83-9b5d-aa304e44f066',
state: 'screening',
closing_date: '2018-10-28 06:30:00' },
{
role_name: 'Delivery Representative',
position_id: '12345678-5adc-4209-aec2-9c4962550ab1',
email_address: 'xyz.recruiter@gmail.com',
application_id: '2adc5236-989d-49f2-ab3e-cb7e42798b77',
state: 'qualified',
closing_date: '2018-10-28 06:30:00' },
{
role_name: 'Micro Space Planner',
position_id: 'fe30930f-7d9f-4953-8939-6d9924462b2b',
email_address: 'abc.recruiter@gmail.com',
application_id: '293bd084-64f0-4c83-9b5d-aa304e44f066',
state: 'screening',
closing_date: '2018-10-28 06:30:00' },
{
role_name: 'Delivery Representative',
position_id: '12345678-5adc-4209-aec2-9c4962550ab1',
email_address: 'xyz.recruiter@gmail.com',
application_id: '2adc5236-989d-49f2-ab3e-cb7e42798b77',
state: 'qualified',
closing_date: '2018-10-28 06:30:00' }]
我想将具有状态的对象计算为与每个职位相对应的offer和 interview。我正在使用 npmlodash
库。
我已经检查了关于 SO 的几个问题,关于 group by 和 count 使用过滤器,但在我的情况下,位置 id 是动态的。所以我不能设置 position_id 的具体值,我可以使用它来对对象进行分组。
例如 position_id as '12345678-5adc-4209-aec2-8b3962550ce7' 包含 1 个 offer 和 1 interview
预期输出:
{
role_name: 'Delivery Representative',
position_id: '12345678-5adc-4209-aec2-9c4962550ab1',
email_address: 'xyz.recruiter@gmail.com',
offer_count: 1,
interview_count: 1
},
{
role_name: 'Micro Space Planner',
position_id: 'fe30930f-7d9f-4953-8939-6d9924462b2b',
email_address: 'abc.recruiter@gmail.com',
offer_count: 0,
interview_count:0
},
{
role_name: 'Delivery Representative',
position_id: '090276f0-3fca-4b2a-85ed-697d21c405a0',
email_address: 'abc.recruiter@gmail.com',
offer_count: 0,
interview_count:2
}
解决方案
您可以使用 和 的组合reduce
,map
无论是原生 JS 还是 lodash 版本。首先,通过位置 id 减少记录,然后映射对象条目以生成所需的数组。
Object.entries(input_arr.reduce((acc, item) => {
if (!acc[item.position_id]) {
acc[item.position_id] = {
interview_count: 0,
offer_count: 0,
email_address: item.email_address,
role_name: item.role_name
};
}
if (item.state === 'interview') acc[item.position_id].interview_count += 1;
if (item.state === 'offer') acc[item.position_id].offer_count += 1;
return acc;
}, {})).map(([position_id, {email_address, interview_count, offer_count, role_name}]) => {
return {
position_id,
email_address,
interview_count,
offer_count,
role_name
};
});
这是一个小提琴
推荐阅读
- ios - Swift 用于 JSONEncoder 的默认日期格式是什么?
- c# - 为什么我可以使用 `HttpClient` 发出并发 HTTP 请求的阈值?
- r - 计算预定义分隔符之间的单词数
- algorithm - 找到总成本最小的区间子集,它们一起仍然覆盖初始区间
- reactjs - 如何修改 Gatsby Starter Lightbox 以查询特定图片目录?
- parcel - 使用 Pug 和多个入口点设置 Parcel 的问题
- sql - 延长表中列的长度 - 它会在数据库中破坏什么?
- gpu - 在没有 GPU 的情况下运行 RAPIDS 进行开发?
- json - 用 jq 改变子元素
- polymer - 如何通过它的方法重置聚合物铁自动生长文本区域或纸张文本区域?