javascript - 如何使用 lodash javascript 对对象中的数组数据进行分组

标签 javascript node.js

我想使用 lodash javscript 对数据进行分组。首先我尝试使用 groupBy machine_id 然后对总值进行求和

这是我的数据

const data = [
  {
    id: 1,
    machine_id: 1,
    work_id: 1,
    total: 10
  },
  {
    id: 2,
    machine_id: 1,
    work_id: 2,
    total: 15
  },
  {
    id: 3,
    machine_id: 2,
    work_id: 3,
    total: 10
  },
  {
    id: 4,
    machine_id: 1,
    work_id: 1,
    total: 15
  },
]

我想对 machine_id 进行分组,然后我想按 machine_id 求和,然后我想对每个 work_id 求和

我想这样输出

[
  {
      "machine_id": 1,
      "sum_total": 25
      "work_group": [
        // In this work group I want to sum total each work_id 
        {
          work_id: 1
          sum_total: 25
        },
          {
          work_id: 2
          sum_total: 15
        }
      ]
    },
    {
      "machine_id": 2,
      "sum_total": 10
      "work_group": [
        {
          work_id: 3
          sum_total: 10
        }
      ]
    },
]

这就是我的尝试

let groupData = _(data)
.groupBy("machine_id")
.map((data, machine_id) => ({
    machine_id,
    sum_total: _.sumBy(data, item => Number(item.total_time))
}))
.value();

我的输出如下所示:

[
  {
      "machine_id": 1,
      "sum_total": 25

    },
    {
      "machine_id": 2,
      "sum_total": 10

    },
]

如何按 work_id 深入了解总和

最佳答案

用户reduceObject.values将简化

const data = [
  {
    id: 1,
    machine_id: 1,
    work_id: 1,
    total: 10
  },
  {
    id: 2,
    machine_id: 1,
    work_id: 2,
    total: 15
  },
  {
    id: 3,
    machine_id: 2,
    work_id: 3,
    total: 10
  },
  {
    id: 4,
    machine_id: 1,
    work_id: 1,
    total: 15
  }
];

const updated = Object.values(
  data.reduce((acc, curr) => {
    if (curr.machine_id in acc) {
      const work_group = [
        ...acc[curr.machine_id].work_group,
        { work_id: curr.work_id, sum_total: curr.total }
      ].reduce((wg_acc, wg_curr) => {
        wg_acc[wg_curr.work_id] =
          wg_curr.work_id in wg_acc
            ? {
                ...wg_acc[wg_curr.work_id],
                sum_total: wg_acc[wg_curr.work_id].sum_total + wg_curr.sum_total
              }
            : { ...wg_curr };
        return wg_acc;
      }, {});
      acc[curr.machine_id] = {
        ...acc[curr.machine_id],
        sum_total: acc[curr.machine_id].sum_total + curr.total,
        work_group: Object.values(work_group)
      };
    } else {
      acc[curr.machine_id] = {
        machine_id: curr.machine_id,
        sum_total: curr.total,
        work_group: [{ work_id: curr.work_id, sum_total: curr.total }]
      };
    }

    return acc;
  }, {})
);

console.log(updated);

关于javascript - 如何使用 lodash javascript 对对象中的数组数据进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60162197/

相关文章:

javascript - 需要有关 JavaScript 函数的帮助来确定升序数字

node.js - Loopback.io 模型、aclprincipalId、$owner

html - 如何递归爬取url子目录?

javascript - 是否可以使用 jquery 完全删除元素?

javascript - 从远程源获取 x 并镜像到列表

javascript - $ 未在 mocha chai 测试脚本中定义

javascript - d3 拖动和缩放不起作用

javascript - Validators.pattern 未显示手机号码错误

mysql - Sequelize : Write multidimensional array to database

javascript - grunt.registerTask 不能修改全局的 grunt 任务设置