Javascript 从对象数组中获取具有总和的不同项
我真的找过了,找不到正确的答案。我有一个对象数组:Javascript 从对象数组中获取具有总和的不同项,javascript,arrays,javascript-objects,Javascript,Arrays,Javascript Objects,我真的找过了,找不到正确的答案。我有一个对象数组: [ { currentMonth: 'September-2018', employeeNumber: '130', caLastName: 'Bartoletti', caFirstName: 'Elias', payrollCode: '505', rate_per_hour: 25, clientType: 'Single', totalHours: 24, wages: 6
[ { 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 } ]
您可以使用reduce和聚合数据,如 常量数据=[{currentMonth:'June-2018', 员工编号:“130”, caLastName:“Bartoletti”, caFirstName:“Elias”, 工资代码:“505”, 每小时费率:25, clientType:'Single', 总时数:24, 工资:633.6}, {当前月份:'2018年9月', 员工编号:“130”, caLastName:“Bartoletti”, caFirstName:“Elias”, 工资代码:“404”, 每小时费率:25, clientType:'Single', 总时数:48, 工资:2534.4}, {当前月份:'2018年9月', 员工编号:“130”, caLastName:“Bartoletti”, caFirstName:“Elias”, 工资代码:“303”, 每小时费率:25, clientType:'Single', 总时数:24, 工资:633.6}, {当前月份:'2018年9月', 员工编号:“130”, caLastName:“Bartoletti”, caFirstName:“Elias”, 工资代码:“203”, 每小时费率:25, clientType:'Single', 总时数:24, 工资:950.4000000000001}, {当前月份:'2018年9月', 员工编号:“130”, caLastName:“Bartoletti”, caFirstName:“Elias”, 工资代码:“202”, 每小时费率:25, clientType:'Single', 总时数:48, 工资:2534.4}, {当前月份:'2018年9月', 员工编号:“196”, caLastName:“手推车”, caFirstName:‘Felicia’, 工资代码:“500”, 每小时费率:25, clientType:'Single', 总时数:24, 工资:576}, {当前月份:'2018年9月', 员工编号:“196”, caLastName:“手推车”, caFirstName:‘Felicia’, 工资代码:“400”, 每小时费率:25, clientType:'Single', 总时数:48, 工资:2304}, {当前月份:'2018年9月', 员工编号:“196”, caLastName:“手推车”, caFirstName:‘Felicia’, 工资代码:“300”, 每小时费率:25, clientType:'Single', 总时数:24, 工资:576}, {当前月份:'2018年9月', 员工编号:“196”, caLastName:“手推车”, caFirstName:‘Felicia’, 工资代码:“201”, 每小时费率:25, clientType:'Single', 总时数:24, 工资:864}, {当前月份:'2018年9月', 员工编号:“196”, caLastName:“手推车”, caFirstName:‘Felicia’, 工资代码:“200”, 每小时费率:25, clientType:'Single', 总时数:48, 工资:2304}] const res=data.reduceac,obj=>{ const index=acc.findIndexitem=>item.employeeNumber===obj.employeeNumber; ifindex>-1{ 控制台logacc[索引] acc[index]={…acc[index],总时数:acc[index]。总时数+obj.TOTALLHOURS,工资:acc[index]。工资+obj.WARGES}; }否则{ acc=acc.concat[obj]; } 返回acc; }, []
console.logres 我想出了一个简单的解决办法
const result = arr.reduce(function(acc, item) {
let found = acc.find(processedItem => processedItem.employeeNumber === item.employeeNumber);
if (found) {
found.totalHours += item.totalHours;
found.wages += item.wages;
} else acc.push(item);
return acc;
}, []);
console.log(result);
这里提出并回答了一个类似的问题: 对答案的粗略解释: 1使用循环遍历每个项目 2从要按currentMonth、employeeNumber、caLastName、caFirstName、rate_per_hour、clientType分组的所有属性中生成一个“键” 3对要求和的值求和 这里的重要部分是将键和值保存到循环外的对象中,如果在源数组中找到具有相同键的另一个对象,则可以将其引用回循环。您需要拆分|字符上的键,以恢复各个属性 示例I link使用reduce,您可以根据需要对其进行修改,但也可以在for循环中应用相同的逻辑 对于较小的数据集,For往往优于reduce,而对于较大的数据集,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 employees = data.reduce((result, employee) => {
const key = employee.caLastName + " " + employee.caFirstName;
if (result[key]) {
result[key].totalHours += employee.totalHours;
result[key].wages += employee.wages;
} else {
result[key] = Object.assign({}, employee);
}
return result;
}, {});
console.log(employees);
记住,使用reduce时,您可能希望指定累加器的初始状态,空对象在这个实例中听起来很合适,并且reduce函数返回累加器,以便在下一次迭代中使用它
下面是我在控制台中快速编写的代码,应该可以让您朝着正确的方向前进。我救了你的exa
将对象简化为一个变量,该变量的名称为x:
希望上面的代码和注释能为您提供足够的起点,使您能够在将来构建reduce函数而不会遇到任何麻烦 您可以使用reduce函数迭代数组,并在reduce函数中检查项是否已经存在。但时间复杂度将是n^2
let array = [ { 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 } ];
let myArray = array.reduce((arr, value)=>{
let index = arr.findIndex( item => item.employeeNumber == value.employeeNumber );
if( index >= 0 ){
arr[index].wages += value.wages;
arr[index].totalHours += value.totalHours;
} else {
arr.push(value);
}
console.log(index);
return arr;
}, []);
console.log(myArray);
您还可以使用时间复杂度为n的对象键映射dict实现上述结果。
以下是代码:
let myArray2 = array.reduce((obj, value)=>{
if( obj[value.employeeNumber] ){
obj[value.employeeNumber].totalHours += value.totalHours;
obj[value.employeeNumber].wages += value.wages
} else {
obj[value.employeeNumber] = Object.assign({}, value );
}
return obj;
}, {});
let finalArrayValues = Object.values(myArray2)
console.log(finalArrayValues);
您能否为您的问题添加一个仅包含两个对象的数组的示例?
let myArray2 = array.reduce((obj, value)=>{
if( obj[value.employeeNumber] ){
obj[value.employeeNumber].totalHours += value.totalHours;
obj[value.employeeNumber].wages += value.wages
} else {
obj[value.employeeNumber] = Object.assign({}, value );
}
return obj;
}, {});
let finalArrayValues = Object.values(myArray2)
console.log(finalArrayValues);