首页 > 解决方案 > 从对象数组中获取具有总和的不同项目

问题描述

我真的搜索过,找不到正确的答案。我有一个对象数组:

[ { currentMonth: 'September-2018',
    employeeNumber: '130',
    caLastName: 'Bartoletti',
    caFirstName: 'Elias',
    payrollCode: '505',
    rate_per_hour: 25,
    clientType: 'Single',
    totalHours: 24,
    wages: 633.6 },
  { currentMonth: 'September-2018',
    employeeNumber: '130',
    caLastName: 'Bartoletti',
    caFirstName: 'Elias',
    payrollCode: '404',
    rate_per_hour: 25,
    clientType: 'Single',
    totalHours: 48,
    wages: 2534.4 },
  { currentMonth: 'September-2018',
    employeeNumber: '130',
    caLastName: 'Bartoletti',
    caFirstName: 'Elias',
    payrollCode: '303',
    rate_per_hour: 25,
    clientType: 'Single',
    totalHours: 24,
    wages: 633.6 },
  { currentMonth: 'September-2018',
    employeeNumber: '130',
    caLastName: 'Bartoletti',
    caFirstName: 'Elias',
    payrollCode: '203',
    rate_per_hour: 25,
    clientType: 'Single',
    totalHours: 24,
    wages: 950.4000000000001 },
  { currentMonth: 'September-2018',
    employeeNumber: '130',
    caLastName: 'Bartoletti',
    caFirstName: 'Elias',
    payrollCode: '202',
    rate_per_hour: 25,
    clientType: 'Single',
    totalHours: 48,
    wages: 2534.4 },
  { currentMonth: 'September-2018',
    employeeNumber: '196',
    caLastName: 'Barrows',
    caFirstName: 'Felicia',
    payrollCode: '500',
    rate_per_hour: 25,
    clientType: 'Single',
    totalHours: 24,
    wages: 576 },
  { currentMonth: 'September-2018',
    employeeNumber: '196',
    caLastName: 'Barrows',
    caFirstName: 'Felicia',
    payrollCode: '400',
    rate_per_hour: 25,
    clientType: 'Single',
    totalHours: 48,
    wages: 2304 },
  { currentMonth: 'September-2018',
    employeeNumber: '196',
    caLastName: 'Barrows',
    caFirstName: 'Felicia',
    payrollCode: '300',
    rate_per_hour: 25,
    clientType: 'Single',
    totalHours: 24,
    wages: 576 },
  { currentMonth: 'September-2018',
    employeeNumber: '196',
    caLastName: 'Barrows',
    caFirstName: 'Felicia',
    payrollCode: '201',
    rate_per_hour: 25,
    clientType: 'Single',
    totalHours: 24,
    wages: 864 },
  { currentMonth: 'September-2018',
    employeeNumber: '196',
    caLastName: 'Barrows',
    caFirstName: 'Felicia',
    payrollCode: '200',
    rate_per_hour: 25,
    clientType: 'Single',
    totalHours: 48,
    wages: 2304 } ]

我想要的是一个新的对象数组,显示 currentMonth、employeeNumber、caLastName、caFirstName、rate_per_hour、clientType、totalHours 的总和以及每个员工的工资总和。所以在这个例子中,一个只有两个对象的数组。

我尝试过减少和过滤,但我无法准确理解我哪里出错了。我宁愿不做一个循环,因为我怀疑效率会低很多。

新数组看起来有点像:

[ { currentMonth: 'September-2018',
    employeeNumber: '130',
    caLastName: 'Bartoletti',
    caFirstName: 'Elias',
    rate_per_hour: 25,
    clientType: 'Single',
    totalHours: 168,
    wages: 7286.4 },
  { currentMonth: 'September-2018',
    employeeNumber: '196',
    caLastName: 'Barrows',
    caFirstName: 'Felicia',
    rate_per_hour: 25,
    clientType: 'Single',
    totalHours: 168,
    wages: 6624 } ]

标签: javascriptarraysjavascript-objects

解决方案


您可以使用 reduce 和聚合数据,例如

const data = [ { currentMonth: 'September-2018',
    employeeNumber: '130',
    caLastName: 'Bartoletti',
    caFirstName: 'Elias',
    payrollCode: '505',
    rate_per_hour: 25,
    clientType: 'Single',
    totalHours: 24,
    wages: 633.6 },
  { currentMonth: 'September-2018',
    employeeNumber: '130',
    caLastName: 'Bartoletti',
    caFirstName: 'Elias',
    payrollCode: '404',
    rate_per_hour: 25,
    clientType: 'Single',
    totalHours: 48,
    wages: 2534.4 },
  { currentMonth: 'September-2018',
    employeeNumber: '130',
    caLastName: 'Bartoletti',
    caFirstName: 'Elias',
    payrollCode: '303',
    rate_per_hour: 25,
    clientType: 'Single',
    totalHours: 24,
    wages: 633.6 },
  { currentMonth: 'September-2018',
    employeeNumber: '130',
    caLastName: 'Bartoletti',
    caFirstName: 'Elias',
    payrollCode: '203',
    rate_per_hour: 25,
    clientType: 'Single',
    totalHours: 24,
    wages: 950.4000000000001 },
  { currentMonth: 'September-2018',
    employeeNumber: '130',
    caLastName: 'Bartoletti',
    caFirstName: 'Elias',
    payrollCode: '202',
    rate_per_hour: 25,
    clientType: 'Single',
    totalHours: 48,
    wages: 2534.4 },
  { currentMonth: 'September-2018',
    employeeNumber: '196',
    caLastName: 'Barrows',
    caFirstName: 'Felicia',
    payrollCode: '500',
    rate_per_hour: 25,
    clientType: 'Single',
    totalHours: 24,
    wages: 576 },
  { currentMonth: 'September-2018',
    employeeNumber: '196',
    caLastName: 'Barrows',
    caFirstName: 'Felicia',
    payrollCode: '400',
    rate_per_hour: 25,
    clientType: 'Single',
    totalHours: 48,
    wages: 2304 },
  { currentMonth: 'September-2018',
    employeeNumber: '196',
    caLastName: 'Barrows',
    caFirstName: 'Felicia',
    payrollCode: '300',
    rate_per_hour: 25,
    clientType: 'Single',
    totalHours: 24,
    wages: 576 },
  { currentMonth: 'September-2018',
    employeeNumber: '196',
    caLastName: 'Barrows',
    caFirstName: 'Felicia',
    payrollCode: '201',
    rate_per_hour: 25,
    clientType: 'Single',
    totalHours: 24,
    wages: 864 },
  { currentMonth: 'September-2018',
    employeeNumber: '196',
    caLastName: 'Barrows',
    caFirstName: 'Felicia',
    payrollCode: '200',
    rate_per_hour: 25,
    clientType: 'Single',
    totalHours: 48,
    wages: 2304 } ]
    
const res = data.reduce((acc, obj) => {
     const index = acc.findIndex(item => item.employeeNumber === obj.employeeNumber);
     if(index > -1) {
         console.log(acc[index])
         acc[index] = {...acc[index], totalHours: acc[index].totalHours + obj.totalHours, wages: acc[index].wages + obj.wages};
     } else {
         acc = acc.concat([obj]);
     }
     return acc;
}, [])

console.log(res);


推荐阅读