将结果数组缩减为具有总和和用户 ID 的对象数组
Reduce array of results in to array of objects with sums and user id
我正在尝试获取一组结果并将它们缩减为一个数组。
数据为:
const data = [
{ profileid: '1', points: 25, winner: true },
{ profileid: '2', points: 15, winner: false },
{ profileid: '3', points: 18, winner: false },
{ profileid: '1', points: 15, winner: true },
{ profileid: '2', points: 18, winner: false },
{ profileid: '3', points: 25, winner: false },
]
我试图通过用户 ID 总结所有点(我已经做到了这一点)并且还总结了每个对象中的次数 winner === true
预期结果
[
{ profileid: '1', points: 40, wins: 1 },
{ profileid: '2', points: 33, wins: 0 },
{ profileid: '3', points: 43, wins: 1 },
]
目前我无法计算每个对象中“真实”结果的总和。此外,我返回一个对象而不是数组。
片段
const data = [
{ profileid: '1', points: 25, winner: true },
{ profileid: '2', points: 15, winner: false },
{ profileid: '3', points: 18, winner: false },
{ profileid: '1', points: 15, winner: false },
{ profileid: '2', points: 18, winner: false },
{ profileid: '3', points: 25, winner: true },
]
const result = data.reduce((acc, cur) => ({
...acc,
[cur.profileid]: {
profileid: cur.profileid,
points: cur.points + (acc[cur.profileid] ? acc[cur.profileid].points : 0),
wins: cur.winner
? acc[cur.profile]
? acc[cur.profile].wins + 1
: 0
: acc[cur.profile]
? acc[cur.profile].wins
: 0,
},
}),
[]
)
console.log(result)
对 points
应用相同的逻辑可以得出如下结果:
wins: cur.winner ? ((acc[cur.profileid]?.wins || 0) + 1) : (acc[cur.profileid]?.wins || 0),
我们是否首先检查当前 winner
是否为 true
- 如果是,请在
wins
不存在的地方第一次添加 1
(|| 0
)
- 如果没有,就使用
acc[cur.profileid]?.wins
(如果第一次是false
也是一个回退)
const data = [
{ profileid: '1', points: 25, winner: true },
{ profileid: '2', points: 15, winner: false },
{ profileid: '3', points: 18, winner: false },
{ profileid: '1', points: 15, winner: false },
{ profileid: '2', points: 18, winner: false },
{ profileid: '3', points: 25, winner: true },
]
const result = data.reduce((acc, cur) => ({
...acc,
[cur.profileid]: {
wins: cur.winner ? ((acc[cur.profileid]?.wins || 0) + 1) : (acc[cur.profileid]?.wins || 0),
profileid: cur.profileid,
points: cur.points + (acc[cur.profileid] ? acc[cur.profileid].points : 0),
},
}),
[]
)
console.log(result)
也就是说,我个人更喜欢一个简单的 for
和一个 if
来获得更具可读性的代码:
请考虑这个例子:
- 创建空
result
对象
- 遍历
data
数组中的每个对象
- 如果需要,在
data
中创建空对象
- 提高
points
和 wins
值
const data = [
{ profileid: '1', points: 25, winner: true },
{ profileid: '2', points: 15, winner: false },
{ profileid: '3', points: 18, winner: false },
{ profileid: '1', points: 15, winner: false },
{ profileid: '2', points: 18, winner: false },
{ profileid: '3', points: 25, winner: true },
];
const result = {};
for (let i in data) {
// Create current profileId object
if (!result[data[i].profileid]) {
result[data[i].profileid] = {
wins: 0,
points: 0,
profileid: +data[i].profileid
};
}
// Bump points/wins values
result[data[i].profileid].points += data[i].points;
result[data[i].profileid].wins += +data[i].winner;
}
console.log(result);
您可以像对 points
求和一样对 wins
求和:
const data = [
{ profileid: '1', points: 25, winner: true },
{ profileid: '2', points: 15, winner: false },
{ profileid: '3', points: 18, winner: false },
{ profileid: '1', points: 15, winner: true },
{ profileid: '2', points: 18, winner: false },
{ profileid: '3', points: 25, winner: true },
]
const result = data.reduce((acc, cur) => ({
...acc,
[cur.profileid]: {
profileid: cur.profileid,
points: cur.points + (acc[cur.profileid] ? acc[cur.profileid].points : 0),
wins: cur.winner + (acc[cur.profileid] ? acc[cur.profileid].wins : 0)
},
}),
[]
)
console.log(result)
您也可以像这样简化 wins
:
wins: !!(acc[cur.profileid]?.wins) + cur.winner
如果 acc[cur.profileid]?.wins
returns undefined
,
您可以通过 [=17= 将其转换为 Boolean ] 或 Boolean()
以避免得到 NaN
我正在尝试获取一组结果并将它们缩减为一个数组。
数据为:
const data = [
{ profileid: '1', points: 25, winner: true },
{ profileid: '2', points: 15, winner: false },
{ profileid: '3', points: 18, winner: false },
{ profileid: '1', points: 15, winner: true },
{ profileid: '2', points: 18, winner: false },
{ profileid: '3', points: 25, winner: false },
]
我试图通过用户 ID 总结所有点(我已经做到了这一点)并且还总结了每个对象中的次数 winner === true
预期结果
[
{ profileid: '1', points: 40, wins: 1 },
{ profileid: '2', points: 33, wins: 0 },
{ profileid: '3', points: 43, wins: 1 },
]
目前我无法计算每个对象中“真实”结果的总和。此外,我返回一个对象而不是数组。
片段
const data = [
{ profileid: '1', points: 25, winner: true },
{ profileid: '2', points: 15, winner: false },
{ profileid: '3', points: 18, winner: false },
{ profileid: '1', points: 15, winner: false },
{ profileid: '2', points: 18, winner: false },
{ profileid: '3', points: 25, winner: true },
]
const result = data.reduce((acc, cur) => ({
...acc,
[cur.profileid]: {
profileid: cur.profileid,
points: cur.points + (acc[cur.profileid] ? acc[cur.profileid].points : 0),
wins: cur.winner
? acc[cur.profile]
? acc[cur.profile].wins + 1
: 0
: acc[cur.profile]
? acc[cur.profile].wins
: 0,
},
}),
[]
)
console.log(result)
对 points
应用相同的逻辑可以得出如下结果:
wins: cur.winner ? ((acc[cur.profileid]?.wins || 0) + 1) : (acc[cur.profileid]?.wins || 0),
我们是否首先检查当前 winner
是否为 true
- 如果是,请在
wins
不存在的地方第一次添加1
(|| 0
) - 如果没有,就使用
acc[cur.profileid]?.wins
(如果第一次是false
也是一个回退)
const data = [
{ profileid: '1', points: 25, winner: true },
{ profileid: '2', points: 15, winner: false },
{ profileid: '3', points: 18, winner: false },
{ profileid: '1', points: 15, winner: false },
{ profileid: '2', points: 18, winner: false },
{ profileid: '3', points: 25, winner: true },
]
const result = data.reduce((acc, cur) => ({
...acc,
[cur.profileid]: {
wins: cur.winner ? ((acc[cur.profileid]?.wins || 0) + 1) : (acc[cur.profileid]?.wins || 0),
profileid: cur.profileid,
points: cur.points + (acc[cur.profileid] ? acc[cur.profileid].points : 0),
},
}),
[]
)
console.log(result)
也就是说,我个人更喜欢一个简单的 for
和一个 if
来获得更具可读性的代码:
请考虑这个例子:
- 创建空
result
对象 - 遍历
data
数组中的每个对象 - 如果需要,在
data
中创建空对象 - 提高
points
和wins
值
const data = [
{ profileid: '1', points: 25, winner: true },
{ profileid: '2', points: 15, winner: false },
{ profileid: '3', points: 18, winner: false },
{ profileid: '1', points: 15, winner: false },
{ profileid: '2', points: 18, winner: false },
{ profileid: '3', points: 25, winner: true },
];
const result = {};
for (let i in data) {
// Create current profileId object
if (!result[data[i].profileid]) {
result[data[i].profileid] = {
wins: 0,
points: 0,
profileid: +data[i].profileid
};
}
// Bump points/wins values
result[data[i].profileid].points += data[i].points;
result[data[i].profileid].wins += +data[i].winner;
}
console.log(result);
您可以像对 points
求和一样对 wins
求和:
const data = [
{ profileid: '1', points: 25, winner: true },
{ profileid: '2', points: 15, winner: false },
{ profileid: '3', points: 18, winner: false },
{ profileid: '1', points: 15, winner: true },
{ profileid: '2', points: 18, winner: false },
{ profileid: '3', points: 25, winner: true },
]
const result = data.reduce((acc, cur) => ({
...acc,
[cur.profileid]: {
profileid: cur.profileid,
points: cur.points + (acc[cur.profileid] ? acc[cur.profileid].points : 0),
wins: cur.winner + (acc[cur.profileid] ? acc[cur.profileid].wins : 0)
},
}),
[]
)
console.log(result)
您也可以像这样简化 wins
:
wins: !!(acc[cur.profileid]?.wins) + cur.winner
如果 acc[cur.profileid]?.wins
returns undefined
,
您可以通过 [=17= 将其转换为 Boolean ] 或 Boolean()
以避免得到 NaN