Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用具有相同秩的相同值对数组中的对象进行不可变的排序_Javascript_Arrays - Fatal编程技术网

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