两个不同对象数组中唯一值的计数

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#entriesArray#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);

【讨论】:

以上是关于两个不同对象数组中唯一值的计数的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB $查找具有不同值的对象数组

如何将对象列表转换为对象列表数组,每个数组索引都有 2 个计数?

两个空对象(空数组)为什么不相等

比较两个对象数组,并将匹配值的元素排除到JS中的新数组中

如何计算Javascript中对象数组中不同值的出现次数?

在数组Vue Js中的另一个不同json对象中具有相同值的数组中的所有json对象中添加/合并新项目