Javascript 使用具有相同秩的相同值对数组中的对象进行不可变的排序
我有一个函数,它获取一个排行榜数组(已经按从高到低的总数排序),然后为数组中的每个对象分配一个排名。如果有多个项目的总数相同,则两个项目应具有相同的排名,例如:Javascript 使用具有相同秩的相同值对数组中的对象进行不可变的排序,javascript,arrays,Javascript,Arrays,我有一个函数,它获取一个排行榜数组(已经按从高到低的总数排序),然后为数组中的每个对象分配一个排名。如果有多个项目的总数相同,则两个项目应具有相同的排名,例如: 1:60 2:55 2:55 2:55 5:50 我最初尝试使用map执行此操作,但似乎无法引用map函数中先前更新的对象。在下面的代码段中,您可以看到数组中的对象2和3如何具有rank:undefined 功能分配排行榜排名(排行榜){ 返回排行榜。地图((项目,索引)=>{ 常量{total}=项目; 如果(索引>0&&tot
- 1:60
- 2:55
- 2:55
- 2:55
- 5:50
map
执行此操作,但似乎无法引用map函数中先前更新的对象。在下面的代码段中,您可以看到数组中的对象2和3如何具有rank:undefined
功能分配排行榜排名(排行榜){
返回排行榜。地图((项目,索引)=>{
常量{total}=项目;
如果(索引>0&&total==排行榜[索引-1]。总计){
返回{
排名:排行榜[索引-1]。排名,
…项目,
};
}
返回{
排名:指数+1,
…项目,
};
});
}
常数排行榜=[
{总数:60},
{总数:55},
{总数:55},
{总数:55},
{总数:50}
];
console.log(`original`,排行榜);
const newleadboard=指定排行榜排名(排行榜);
console.log(`updated`,newleadboard)代码>
我可以使用forEach实现所需的功能,但它会改变原始数组中的对象
只要在循环中更改项
,它就会修改原始数组
使用map
有什么方法可以做到这一点吗
是的,有!您可以将rank
作为闭合变量向上拉,然后仅当当前值低于上一个值时才将其递增
功能分配排行榜排名(排行榜){
设秩=1;
返回排行榜。地图((项目,索引)=>{
常量{total}=项目;
如果(索引>0&&total<排行榜[索引-1]。总计){
排名=指数+1
}
返回{
等级:等级,
…项目,
};
});
}
常数排行榜=[
{总数:60},
{总数:55},
{总数:55},
{总数:55},
{总数:50}
];
console.log(`original`,排行榜);
const newleadboard=指定排行榜排名(排行榜);
console.log(`updated`,newleadboard)代码>const newleadboard=[…排行榜]代码>这只生成数组的浅拷贝,因此数组中的所有对象与第一个数组中的对象完全相同。改变一个改变另一个。在修改对象之前,您需要克隆对象。这是否回答了您的问题?最后一个对象的排名不应该是3
而不是5
?不幸的是,最后一个项目的排名应该是5,这就是大多数基于运动的排行榜的工作方式。@guerraladio好吧,你可以将+=1改为=index+1