javascript – 迭代一个对象数组,用相同的索引求和值,并返回一个新的对象数组

前端之家收集整理的这篇文章主要介绍了javascript – 迭代一个对象数组,用相同的索引求和值,并返回一个新的对象数组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个对象数组,如下所示:
  1. const data = [ // array1
  2. [{x: 1},{y:2},{z:3}],[{x: 1},{z:3}]
  3. ],[ // array2
  4. [{x: 1},{z:3}]
  5. ]

需要完成的是将array1中的x与具有相同索引的array2中的x相加. y和z也是如此.最终结果应该是包含求和值的新对象数组.

像这样的东西:

  1. [
  2. [{totalXOne: 2},{totalYOne: 4},{totalZOne: 6}],[{totalXTwo: 2},{totalYTwo: 4},{totalZTwo: 6}],[{totalXThree: 2},{totalYthree: 4},{totalZThree: 6}],]

注意:所有数组的长度都相同,如果缺少值,则将替换为0)

我在MDN上找到了一些不错的东西,但是它总结了所有的x,y,z值,它返回了单个求和值,如下所示:

  1. let initialValue = 0;
  2. let sum = [{x: 1},{x:2},{x:3}].reduce(function(accumulator,currentValue) {
  3. return accumulator + currentValue.x;
  4. },initialValue)

输出

  1. [
  2. [{totalX: 3},{totalY: 6},{totalZ: 9}],// this is not what I need
  3. ]

有什么办法可以实现吗?

UPDATE

我从另一个来源收到JSON.它包含一个名为allEmpsData的属性映射,我得到了必要的salaryData和映射,我得到了NET | GROSS | TAX数据.

  1. let allReports = [];
  2.  
  3. setTimeout(() => {
  4.  
  5. allEmpsData.map(x => {
  6. let reports = {};
  7.  
  8. let years = [];
  9. let months = [];
  10.  
  11. let netArr = [];
  12. let grossArr = [];
  13. let mealArr = [];
  14. let taxArr = [];
  15. let handSalaryArr = [];
  16.  
  17. x.salaryData.map(y => {
  18. years.push(y.year);
  19. months.push(y.month);
  20. netArr.push(y.totalNetSalary);
  21. grossArr.push(y.bankGrossSalary);
  22. mealArr.push(y.bankHotMeal);
  23. taxArr.push(y.bankContributes);
  24. handSalaryArr.push(y.handSalary);
  25. })
  26. reports.year = years;
  27. reports.month = months;
  28. reports.net = netArr;
  29. reports.gross = grossArr;
  30. reports.meal = mealArr;
  31. reports.taxesData = taxArr;
  32. reports.handSalaryData = handSalaryArr;
  33. allReports.push(Object.assign([],reports));
  34. });
  35. },1000);

我可以说,一切都正常,但事实是,.我不知道更好.然后这里有魔力:

  1. setTimeout(() => {
  2. result = allReports.reduce((r,a) =>
  3. a.map((b,i) =>
  4. b.map((o,j) =>
  5. Object.assign(...Object
  6. .entries(o)
  7. .map(([k,v]) => ({ [k]: v + (getV(r,[i,j,k]) || 0) }))
  8. )
  9. )
  10. ),undefined
  11. );
  12. console.log(result);
  13. },1500);

…它在节点控制台中返回一个空数组,但是如果我在上面更新的代码中控制了任何其他属性,那么它就在那里.有什么建议?

解决方法

您可以使用辅助函数获取嵌套对象的值,并将值映射到同一索引.
  1. const getV = (o,p) => p.reduce((t,k) => (t || {})[k],o);
  2.  
  3. var data = [[[{ x: 1 },{ y: 2 },{ z: 3 }],[{ x: 1 },{ z: 3 }]],[[{ x: 1 },{ z: 3 }]]],result = data.reduce((r,a) =>
  4. a.map((b,i) =>
  5. b.map((o,j) =>
  6. Object.assign(...Object
  7. .entries(o)
  8. .map(([k,k]) || 0) }))
  9. )
  10. )
  11. ),undefined
  12. );
  13.  
  14. console.log(result);
  1. .as-console-wrapper { max-height: 100% !important; top: 0; }

猜你在找的JavaScript相关文章