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

我有一个函数,它接受一个排行榜数组(已经按从最高到最低的总数排序),然后为数组内的每个对象分配一个排名。如果多个项目具有相同的总数,则两个项目应具有相同的排名,例如:

  • 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);


慕仙森
浏览 98回答 1
1回答

温温酱

我能够使用 forEach 实现所需的功能,但它会改变原始数组中的对象一旦您item在循环内部进行更改,它将修改原始数组。有什么办法可以做到这一点map吗?就在这里!您可以将rank其作为封闭变量拉起,然后仅在当前值低于前一个值时才增加它。function assignLeaderboardRanks(leaderboard) {&nbsp; let rank = 1;&nbsp; return leaderboard.map((item, index) => {&nbsp; &nbsp; const { total } = item;&nbsp; &nbsp; if (index > 0 && total < leaderboard[index - 1].total) {&nbsp; &nbsp; &nbsp; rank = index + 1&nbsp; &nbsp; }&nbsp; &nbsp; return {&nbsp; &nbsp; &nbsp; rank: rank,&nbsp; &nbsp; &nbsp; ...item,&nbsp; &nbsp; };&nbsp; });}const leaderboard = [&nbsp; { total: 60 },&nbsp; { total: 55 },&nbsp; { total: 55 },&nbsp; { total: 55 },&nbsp; { total: 50 }];console.log(`original`, leaderboard);const newLeaderboard = assignLeaderboardRanks(leaderboard);console.log(`updated`, newLeaderboard);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript