按多个键分组的逻辑
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循环中说明如何做
您可以使用 reduce
和 findIndex
来累积最终结果。每次迭代,您检查累积结果是否已经具有 AgeBin
和 Release
的元素,然后添加或修改该元素
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)
解决此问题的另一种方法是从 AgeBin
和 Release
值中创建一个键,然后使用 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)
输入
[{"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循环中说明如何做
您可以使用 reduce
和 findIndex
来累积最终结果。每次迭代,您检查累积结果是否已经具有 AgeBin
和 Release
的元素,然后添加或修改该元素
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)
解决此问题的另一种方法是从 AgeBin
和 Release
值中创建一个键,然后使用 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)