为了账号安全,请及时绑定邮箱和手机立即绑定

使用具有相同等级的相同值对数组中的对象进行不可变的排名

使用具有相同等级的相同值对数组中的对象进行不可变的排名

慕仙森 2022-05-26 16:54:40
我有一个函数,它接受一个排行榜数组(已经按从最高到最低的总数排序),然后为数组内的每个对象分配一个排名。如果多个项目具有相同的总数,则两个项目应具有相同的排名,例如: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);


查看完整回答
反对 回复 2022-05-26
  • 1 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信