按多个键分组的逻辑

Logic for Group by multiple keys

输入

[{"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循环中说明如何做

您可以使用 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)

解决此问题的另一种方法是从 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)