我有一个函数,它接受一个排行榜数组(已经按从最高到最低的总数排序),然后为数组内的每个对象分配一个排名。如果多个项目具有相同的总数,则两个项目应具有相同的排名,例如:
1:60
2:55
2:55
2:55
5: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);
温温酱
相关分类