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

我有一个对象数组,如下所示:
const data = [                 // array1
  [{x: 1},{y:2},{z:3}],[{x: 1},{z:3}]
],[                            // array2
  [{x: 1},{z:3}]
]

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

像这样的东西:

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

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

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

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

输出

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

有什么办法可以实现吗?

UPDATE

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

let allReports = [];

    setTimeout(() => {

        allEmpsData.map(x => {
            let reports = {};

            let years = [];
            let months = [];

            let netArr = [];
            let grossArr = [];
            let mealArr = [];
            let taxArr = [];
            let handSalaryArr = [];

            x.salaryData.map(y => {
                years.push(y.year);
                months.push(y.month);
                    netArr.push(y.totalNetSalary);
                    grossArr.push(y.bankGrossSalary);
                    mealArr.push(y.bankHotMeal);
                    taxArr.push(y.bankContributes);
                    handSalaryArr.push(y.handSalary);
                })
                reports.year = years;
                reports.month = months;
                reports.net = netArr;
                reports.gross = grossArr;        
                reports.meal = mealArr;        
                reports.taxesData = taxArr;        
                reports.handSalaryData = handSalaryArr;
                allReports.push(Object.assign([],reports));
        });
    },1000);

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

setTimeout(() => {
    result = allReports.reduce((r,a) =>
         a.map((b,i) =>
           b.map((o,j) =>
             Object.assign(...Object
              .entries(o)
               .map(([k,v]) => ({ [k]: v + (getV(r,[i,j,k]) || 0) }))
                    )
                )
            ),undefined
        );
            console.log(result);
        },1500);

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

解决方法

您可以使用辅助函数获取嵌套对象的值,并将值映射到同一索引.
const getV = (o,p) => p.reduce((t,k) => (t || {})[k],o);

var data = [[[{ x: 1 },{ y: 2 },{ z: 3 }],[{ x: 1 },{ z: 3 }]],[[{ x: 1 },{ z: 3 }]]],result = data.reduce((r,a) =>
        a.map((b,i) =>
            b.map((o,j) =>
                Object.assign(...Object
                    .entries(o)
                    .map(([k,k]) || 0) }))
                )
            )
        ),undefined
    );

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是深拷贝与浅拷贝?深拷贝与浅拷贝是js中处理对象或数据复制操作的两种方式。‌在聊深浅拷贝之前咱得了解一下js中的两种数据类型:
前言 今天复习了一些前端算法题,写到一两道比较有意思的题:重建二叉树、反向输出链表每个节点 题目 重建二叉树: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列 {1,2,4,7,3,5,6,8} 和中序遍历序列 {
最近在看回JavaScript的面试题,this 指向问题是入坑前端必须了解的知识点,现在迎来了ES6+的时代,因为箭头函数的出现,所以感觉有必要对 this 问题梳理一下,所以刚好总结一下JavaScript中this指向的问题。
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)