我有一个函数,它接受一个排行榜数组(已经按从最高到最低的总数排序),然后为数组内的每个对象分配一个排名。如果多个项目具有相同的总数,则两个项目应具有相同的排名,例如:1:602:552:552:555:50我最初尝试使用 来执行此操作map,但似乎我无法在 map 函数中引用先前更新的对象。在下面的代码片段中,您可以看到数组中的对象 2 和 3 如何具有rank: undefined.function assignLeaderboardRanks(leaderboard) { return leaderboard.map((item, index) => { const { total } = item; if (index > 0 && total === leaderboard[index - 1].total) { return { rank: leaderboard[index - 1].rank, ...item, }; } return { rank: index + 1, ...item, }; });}const leaderboard = [ { total: 60 }, { total: 55 }, { total: 55 }, { total: 55 }, { total: 50 }];console.log(`original`, leaderboard);const newLeaderboard = assignLeaderboardRanks(leaderboard);console.log(`updated`, newLeaderboard);我可以使用 实现所需的功能forEach,但它会改变原始数组中的对象。有没有办法通过map或改变我的forEach功能来做到这一点?(请注意,由于某种原因,SO 的代码片段显示该数组未发生变异,但如果您使用开发工具进行检查,您会发现它已发生变异)。function assignLeaderboardRanks(leaderboard) { const newLeaderboard = [...leaderboard]; leaderboard.forEach((item, index) => { const { total } = item; if (index > 0 && total === leaderboard[index - 1].total) { item.rank = leaderboard[index - 1].rank; } else { item.rank = index + 1; } }); return newLeaderboard;}const leaderboard = [ { total: 60 }, { total: 55 }, { total: 55 }, { total: 55 }, { total: 50 }];console.log(`original`, leaderboard);const newLeaderboard = assignLeaderboardRanks(leaderboard);console.log(`updated`, newLeaderboard);
1 回答
温温酱
TA贡献1752条经验 获得超4个赞
我能够使用 forEach 实现所需的功能,但它会改变原始数组中的对象
一旦您item在循环内部进行更改,它将修改原始数组。
有什么办法可以做到这一点map吗?
就在这里!您可以将rank其作为封闭变量拉起,然后仅在当前值低于前一个值时才增加它。
function assignLeaderboardRanks(leaderboard) {
let rank = 1;
return leaderboard.map((item, index) => {
const { total } = item;
if (index > 0 && total < leaderboard[index - 1].total) {
rank = index + 1
}
return {
rank: rank,
...item,
};
});
}
const leaderboard = [
{ total: 60 },
{ total: 55 },
{ total: 55 },
{ total: 55 },
{ total: 50 }
];
console.log(`original`, leaderboard);
const newLeaderboard = assignLeaderboardRanks(leaderboard);
console.log(`updated`, newLeaderboard);
添加回答
举报
0/150
提交
取消