javascript - 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 个连续的玩家有相同的分数,这很好用。第三名玩家的排名相同的那一刻,它的行为就很奇怪。有人可以帮忙吗?
解决方案
假设您的数组按点排序。
你可以做的算法是
- 从第二条记录 (i=1) 开始,排名 = 1,步长 = 1
- 如果分数小于上一个记录,则逐步增加排名并重置步骤,否则增加步骤
- 分配排名
- 回到 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;
}
一些额外的:
不要使用var
uselet
或const
不要忘记您可以在 0 以外的地方开始循环,如果所有内容都有 i>0,则意味着我们不需要第一次迭代。
看看一个数组函数 ( forEach()
sort()
find()
, ...) 他们可以派上用场
不要使用大写字母来命名变量
推荐阅读
- python - 基于参数类型调度泛型方法的最快方法?
- java - Kivy 服务不会重启/自动重启
- python - 将数据保留为 pandas 数据框中的最新日期
- java - Apache Camel 3.0.1 无法启动并消耗路由器到 FTPs 文件夹
- laravel - 可以将多字变量传递给刀片组件吗?
- python - 此代码会导致无效的语法错误。为什么?
- javascript - http模块的后端和前端
- javascript - 为什么我在云函数节点 js 中得到减函数错误?
- asp.net - 无法使用 ASP.NET 4.6.1 应用创建 Azure 存储队列消息
- python - 如何在pygame中用小图像填充背景?