javascript - 合并嵌套数组并对值求和

标签 javascript

我有以下格式的数据,

const data = [{
        key:'key1',
        rows:[
          ["A","2018","B","1"],
          ["A","2018","C","5"],
          ["A","2018","B","4"],
          ["A","2018","C","2"],
        ]
      },
      {
        key:'key1',
        rows:[
          ["A","2018","B","10"],
          ["A","2018","C","50"],
          ["A","2018","B","40"],
          ["A","2018","C","20"],
        ]
      }]

我想首先减少并根据第三个值对每个数组中的最后一个值求和。输出应该是这样的,

const data = [{
        key:'key1',
        rows:[
          ["A","2018","B","5"],
          ["A","2018","C","7"]
        ]
      },
      {
        key:'key1',
        rows:[
          ["A","2018","B","50"],
          ["A","2018","C","70"]
        ]
      }]

此后,我想合并这两个对象并对中的值求和。 最终输出应该是这样的,

const data = [{
        key:'key1',
        rows:[
          ["A","2018","B","55"],
          ["A","2018","C","77"]
        ]
      }]

我已经尝试过这个,但没有得到所需的输出,

data.map(data => ({
          ...data,
          rows: data.rows.reduce((array, value) => {
            if(array.length > 0){
              let found = false;
              array.map(m => {
                if(m[2] === value[2]){
                  found = true;
                  return [...m, m[3] = parseInt(m[3]) + parseInt(value[3])]
                }
              })
              if(!found){
                array.push(value)
              }
              return array
            }else{
              array.push(value)
              return array
            }
          }, [])
      }))

最佳答案

实现此目的的一种方法是迭代对象以获取行并将其展平,然后reduce数组以聚合它们,最后使用Object.values最后得到正确的数据集。

const data = [{ key: 'key1', rows: [ ["A", "2018", "B", "1"], ["A", "2018", "C", "5"], ["A", "2018", "B", "4"], ["A", "2018", "C", "2"] ] }, { key: 'key1', rows: [ ["A", "2018", "B", "10"], ["A", "2018", "C", "50"], ["A", "2018", "B", "40"], ["A", "2018", "C", "20"]]}];

const key = data[0].key;

// Use `flatMap` to iterate over the object and merge the rows
const merged = data.flatMap(el => el.rows);

const rows = Object.values(merged.reduce((acc, c) => {
  const [ k1, k2, k3, k4 ] = c;
  acc[k3] = acc[k3] || [ k1, k2, k3, 0 ];
  acc[k3][3] += +k4;
  return acc;
}, {}));

console.log([{ key, rows }]);

注意:如果您需要返回字符串的聚合数字,只需映射结果即可:

.map(([ a, b, c, d ]) => {
  return [ a, b, c, d.toString() ];
});
进一步阅读

关于javascript - 合并嵌套数组并对值求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58170521/

相关文章:

javascript - 获取日期 Javascript + HTML

javascript - Dimple.js - 将数据标签添加到条形图的每个条形

javascript - 按回车键不会调用 HTML 表单中的 javascript 函数

javascript - JSON 对象中的数组长度返回未定义

javascript - 是否可以在单击 5 次后禁用按钮?

javascript - 使用 Javascript AudioContext 将预加载的音频文件连接成一个

javascript - 单击按钮时调用脚本

javascript - 在 Javascript 中,如何在 "joined"数组周围加上单引号?

javascript - Buefy 分页更改事件问题

javascript - 如何在最后一个单词上添加<br/>标签?