首页 > 解决方案 > 减少 - 分成多个批次

问题描述

我想弄清楚如何Batch分组。例如res应该返回两个 Batch ofFG

var data = {
    Items: [{
        ItemId: "222",
        Sum: 2,
        Batch: "F"
    }, {
        ItemId: "222",
        Sum: 2,
        Batch: "F"
    }, {
        ItemId: "333",
        Sum: 3,
        Batch: "G"
    }, {
        ItemId: "333",
        Sum: 5,
        Batch: "F"
    }, ]
};

var res = data.Items.reduce((acc,obj)=>{
    var existObj = acc.find(item=>item.Id === obj.ItemId);

    if (existObj) {
        existObj.Sum += obj.Sum;

        return acc;
    }

    acc.push({
        Id: obj.ItemId,
        Sum: obj.Sum
    });

    return acc;
}
, []);

目前它的输出如下:

[
  {
    "Id": "222",
    "Sum": 4
  },
  {
    "Id": "333",
    "Sum": 8
  }
]

上面的逻辑,如果对象中存在 ItemId,则添加Sum. 它结合了 ItemId 以消除重复。

它应该拆分为批次并基于Batch. 例如预期的输出是这样的:

{
  "Batch": [
    {
      "BatchName": "F",
      "Lines": [
        {
          "Id": "222",
          "Sum": 4
        },
        {
          "Id": "333",
          "Sum": 5
        }
      ]
    },
    {
      "BatchName": "G",
      "Lines": [
        {
          "Id": "333",
          "Sum": 3
        }
      ]
    }
  ]
}

注意:结构不必相同

标签: javascriptnode.js

解决方案


以下应该可以为您提供所需的东西

var tmp = data.Items.reduce((a,{ItemId, Sum, Batch})=>{
   a[Batch] = a[Batch] || {}
   a[Batch][ItemId] = a[Batch][ItemId] || {ItemId, Sum:0}
   a[Batch][ItemId].Sum += Sum
   return a;

},{});

var res = Object.keys(tmp)
      .reduce((a,k)=> a.concat({BatchName: k, Lines: Object.values(tmp[k])}),[])
      
console.log(res)
<script>
var data = {
    Items: [{
        ItemId: "222",
        Sum: 2,
        Batch: "F"
    }, {
        ItemId: "222",
        Sum: 2,
        Batch: "F"
    }, {
        ItemId: "333",
        Sum: 3,
        Batch: "G"
    }, {
        ItemId: "333",
        Sum: 5,
        Batch: "F"
    }, ]
};

</script>


推荐阅读