我有一个对象数组如下:
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' }]
我想用状态作为要约和对应于每个位置的面试来计算对象。我正在使用npm lodash
库。
我已经检查了几个关于组的问题,并使用过滤器计数,但在我的情况下,位置id是动态的。所以我无法设置position_id的具体值,我可以使用它来对对象进行分组。
例如position_id as'12345678-5adc-4209-aec2-8b3962550ce7'包含1个出价和1个采访
预期产出:
{
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
}
您可以将原始数组缩减为新的哈希对象,以保存位置的映射并计算输入数组的状态。
let interviews = input_array.reduce(function(acc, cur) { // go over every applicant
if (!acc[cur.position_id]) {
acc[cur.position_id] = { //set initial object if the job is new
role_name: cur.role_name,
...,
offer_count: 0,
interview_count:0
}
}
if (cur.state === "offer") {
acc[cur.position_id].offer_count++;
} else if (cur.state === "interview") {
acc[cur.position_id].interview_count++;
}
return acc;
}, {});
Reduce是一个原生JS数组方法,因此您实际上不需要使用lodash或任何外部库进行此计算
您可以使用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
};
});
这是一个fiddle
您可以使用函数reduce
按id
和函数Object.values
对对象进行分组,以提取分组对象。
let 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' }],
result = Object.values(input_array.reduce((a, {state, role_name, position_id, email_address}) => {
a[position_id] = (a[position_id] || {role_name, position_id, email_address, offer_count: 0, interview_count: 0});
a[position_id].offer_count += (state === 'offer');
a[position_id].interview_count += (state === 'interview');
return a;
}, Object.create(null)));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
你可以用这样的东西做这个,不用lodash和reduce
,Object.assign
和Object.values
:
var data = [{ 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' }]
const combine = (r = {offer_count: 0, interview_count: 0}, c) => {
r.offer_count += c.state ==='offer'
r.interview_count += c.state === 'interview'
let {application_id, state, closing_date, ...rest} = c
return Object.assign(r, rest)
}
const countEm = d => Object.values(d.reduce((r,c) => (r[c.position_id] = combine(r[c.position_id], c), r), {}))
console.log(countEm(data))