首页 > 解决方案 > Javascrip 遍历 for 循环 - 逻辑

问题描述

伙计们,我正在从我的集合中提取数据到这样的数组中

obj = [{
  "PlayerName": "Satyajit Sahay",
  "Points": 83.83,
  "Rank": 1
},
{
  "PlayerName": "Chirag Galundia",
  "Points": 75.69,
  "Rank": 2
},
{
  "PlayerName": "Kashyap Kapoor",
  "Points": 70.91,
  "Rank": 3
}]

大约有 190 条这样的记录。我的努力是在 for 循环中迭代数组。然后确定点是否相同。如果相同,我分配相同的等级,否则我分配等级+1。这是到目前为止编写的代码

var ranking = 1
for (i = 0; i < obj[0].length; i++) {
  if (i > 0 && obj[0][i].Points < obj[0][i - 1].Points) {
    ranking++
    obj[0][i].Rank = ranking;
  } else if (i > 0 && obj[0][i].Points === obj[0][i - 1].Points) {
    obj[0][i].Rank = ranking;
    ranking++
  }
}

如果 2 个连续的玩家有相同的分数,这很好用。第三名玩家的排名相同的那一刻,它的行为就很奇怪。有人可以帮忙吗?

标签: javascript

解决方案


假设您的数组按点排序。

你可以做的算法是

  1. 从第二条记录 (i=1) 开始,排名 = 1,步长 = 1
  2. 如果分数小于上一个记录,则逐步增加排名并重置步骤,否则增加步骤
  3. 分配排名
  4. 回到 2 直到我们到达数组的末尾

又名

let ranking=1;
let step=1
for(i=1; i<obj.length; i++){
   if(obj[i].points < obj[i-1].points){
        ranking += step;
        step = 1;
   } else {
        step++;
   }
   obj[i].ranking = ranking;
}

一些额外的:

不要使用varuseletconst

不要忘记您可以在 0 以外的地方开始循环,如果所有内容都有 i>0,则意味着我们不需要第一次迭代。

看看一个数组函数 ( forEach() sort() find(), ...) 他们可以派上用场

不要使用大写字母来命名变量


推荐阅读