【问题标题】:Logic for Group by multiple keys按多个键分组的逻辑
【发布时间】:2020-09-29 09:13:31
【问题描述】:

输入

[{"DefectsCount":1,"Release":"5.7.1.0","SWID":"23","AgeBin":"0-20","BinStart":0,"ReleaseSWID":"5.6.1.1.23"},{"DefectsCount":1,"Release":"5.7.1.0","SWID":"172","AgeBin":"0-20","BinStart":0,"ReleaseSWID":"5.7.1.0.172"},{"DefectsCount":1,"Release":"5.6.1.2","SWID":null,"AgeBin":"0-21","BinStart":0}]

输出

[
{"DefectsCount":1,"AgeBin":"0-21","Release":"5.6.1.2"},

{"DefectsCount":2,"AgeBin":"0-20","Release":"5.7.1.0"},

]

需要按 AgeBin 和 Release 分组并获取它的计数

项目中不允许Loadash,请在for循环中说一下怎么做

【问题讨论】:

    标签: javascript for-loop group-by count logic


    【解决方案1】:

    解决此问题的另一种方法是从AgeBinRelease 值中创建一个键,并使用reduce 通过该键对DefectsCount 求和。然后可以使用map 将该对象拆分为结果数组:

    const data = [{
        DefectsCount: 1,
        Release: "5.7.1.0",
        SWID: "23",
        AgeBin: "0-20",
        BinStart: 0,
        ReleaseSWID: "5.6.1.1.23",
      },
      {
        DefectsCount: 1,
        Release: "5.7.1.0",
        SWID: "172",
        AgeBin: "0-20",
        BinStart: 0,
        ReleaseSWID: "5.7.1.0.172",
      },
      {
        DefectsCount: 1,
        Release: "5.6.1.2",
        SWID: null,
        AgeBin: "0-21",
        BinStart: 0,
      },
    ]
    
    const out = Object.entries(data.reduce((c, o) => {
        const group = o.AgeBin + '#' + o.Release;
        c[group] = (c[group] || 0) + o.DefectsCount;
        return c;
      }, {}))
      .map(a => {
        [AgeBin, Release] = a[0].split('#');
        DefectsCount = a[1];
        return {
          AgeBin,
          Release,
          DefectsCount
        }
      });
    
    console.log(out)

    【讨论】:

      【解决方案2】:

      您可以使用reducefindIndex 来累积最终结果。每次迭代,检查累积结果中是否已经有 AgeBinRelease 的元素,然后添加或修改该元素

      data.reduce((acc, el) => {
        const groupIndex = acc.findIndex(
          (g) => g.AgeBin === el.AgeBin && g.Release === el.Release
        )
        if (groupIndex >= 0) {
          acc[groupIndex] = {
            ...acc[groupIndex],
            DefectsCount: acc[groupIndex].DefectsCount + el.DefectsCount,
          }
        } else {
          acc.push({
            DefectsCount: el.DefectsCount,
            AgeBin: el.AgeBin,
            Release: el.Release,
          })
        }
      
        return acc
      }, [])
      

      可运行示例

      const data = [
        {
          DefectsCount: 1,
          Release: "5.7.1.0",
          SWID: "23",
          AgeBin: "0-20",
          BinStart: 0,
          ReleaseSWID: "5.6.1.1.23",
        },
        {
          DefectsCount: 1,
          Release: "5.7.1.0",
          SWID: "172",
          AgeBin: "0-20",
          BinStart: 0,
          ReleaseSWID: "5.7.1.0.172",
        },
        {
          DefectsCount: 1,
          Release: "5.6.1.2",
          SWID: null,
          AgeBin: "0-21",
          BinStart: 0,
        },
      ]
      
      const res = data.reduce((acc, el) => {
        const groupIndex = acc.findIndex(
          (g) => g.AgeBin === el.AgeBin && g.Release === el.Release
        )
        if (groupIndex >= 0) {
          acc[groupIndex] = {
            ...acc[groupIndex],
            DefectsCount: acc[groupIndex].DefectsCount + el.DefectsCount,
          }
        } else {
          acc.push({
            DefectsCount: el.DefectsCount,
            AgeBin: el.AgeBin,
            Release: el.Release,
          })
        }
      
        return acc
      }, [])
      
      console.log(res)

      【讨论】:

        猜你喜欢
        • 2019-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-04
        • 2021-02-13
        • 2015-02-08
        • 1970-01-01
        相关资源
        最近更新 更多