两个不同对象数组中唯一值的计数
Posted
技术标签:
【中文标题】两个不同对象数组中唯一值的计数【英文标题】:Count of unique values in two distinct array of object 【发布时间】:2022-01-23 04:26:59 【问题描述】:假设 arr1 和 arr2 是两个不同的门,我们必须找出从不同门进入的员工数量。
我试图解决这个问题,但输出应该是 Cognizant: 1, Infosys: 1, Wipro: 2
我收到的是 Cognizant: 1, Infosys: 2, Wipro: 3
const arr1 = [
empId: 1,
employer: 'Infosys',
,
empId: 2,
employer: 'Wipro',
,
empId: 3,
employer: 'Cognizant',
]
const arr2 = [
empId: 1,
employer: 'Infosys',
,
empId: 2,
employer: 'Wipro',
,
empId: 3,
employer: 'Wipro'
]
我的方法
const arr3 = [...arr1, ...arr2]
console.log(arr3)
const output = arr3.reduce(function (acc, curr)
if(acc[curr.employer])
acc[curr.employer] = ++acc[curr.employer]
else
acc[curr.employer] = 1
return acc
,)
console.log(output)
【问题讨论】:
你能澄清几点吗?您是否想知道有多少员工通过这两个大门进入?如果是这样,您是否试图通过公司获得这笔款项?为什么empID 3 有两个不同的雇主?您是否想知道每家公司使用了多少个门? empID 是否相关?当 Infosys 出现在两个阵列中时,为什么您希望它为 1?如果您正在跟踪公司的独特门使用情况,我希望 Cognizant: 1, Infosys: 2, Wipro: 2
,因为 InfoSys 和 Wipro 都在两个阵列中,而 Cognizant 只在一个阵列中。
【参考方案1】:
使用spread operator
,连接两个数组。使用Array#reduce
,迭代结果列表,同时更新Map
,其中雇主为key
,员工ID 列表为value
。这将导致按雇主对员工 ID 进行分组。
使用Map#entries
和Array#reduce
,迭代结果对,同时更新一个对象,其中雇主/门是key
,其唯一ID 的数量(使用Set
)是value
。
const
arr1 = [ empId: 1, employer: 'Infosys' , empId: 2, employer: 'Wipro',
, empId: 3, employer: 'Cognizant' ],
arr2 = [ empId: 1, employer: 'Infosys', , empId: 2, employer: 'Wipro' , empId: 3, employer: 'Wipro' ];
const employerEmployeesMap = [...arr1, ...arr2].reduce((map, empId, employer ) =>
map.set(employer, [...(map.get(employer) ?? []), empId])
, new Map);
const gatesCount = [...employerEmployeesMap.entries()].reduce((map, [ gate, employeeIds ]) => (
...map,
[gate]: (new Set(employeeIds)).size
), );
console.log(gatesCount);
【讨论】:
以上是关于两个不同对象数组中唯一值的计数的主要内容,如果未能解决你的问题,请参考以下文章