Javascript 基于多条件/因子的排序算法

Javascript 基于多条件/因子的排序算法,javascript,algorithm,math,Javascript,Algorithm,Math,我正在写一个小游戏,但最后还是被卡住了。这是一个简单的测验,它根据正确回答的问题数量和完成这组问题所花费的时间对用户进行排序 我可以很容易地根据回答最多问题的用户对用户进行排名,但如何根据两个条件计算谁的表现最好?您可以在Array.prototype.sort()的比较函数中一次性处理多个条件 例如: var score = []; storeScore('user1', 7, 65); // 7 correct answers in 65 sec. storeScore('user2',

我正在写一个小游戏,但最后还是被卡住了。这是一个简单的测验,它根据正确回答的问题数量和完成这组问题所花费的时间对用户进行排序


我可以很容易地根据回答最多问题的用户对用户进行排名,但如何根据两个条件计算谁的表现最好?

您可以在Array.prototype.sort()的比较函数中一次性处理多个条件

例如:

var score = [];

storeScore('user1', 7, 65); // 7 correct answers in 65 sec.
storeScore('user2', 8, 70); // 8 correct answers in 70 sec.
storeScore('user3', 6, 50); // 6 correct answers in 50 sec.
storeScore('user4', 7, 50); // 7 correct answers in 50 sec.

score = score.sort(function(a, b) {
  return b.correct > a.correct || (b.correct == a.correct && b.time < a.time);
});

for(var id in score) {
  console.log(
    '#' + ((id | 0) + 1),
    score[id].userId,
    score[id].correct + ' correct answers in ' +
    score[id].time + ' seconds'
  );
}

function storeScore(userId, correct, time) {
  score.push({
    userId : userId,
    correct: correct,
    time   : time
  });
}

利用这两个条件的相对权重进行调整

我的意思很简单。考虑以下等式:

weight(user) = a * parameter_1 + b *  parameter_2
在您的情况下,参数是正确答案的数量和花费的时间,但对于任何数量的参数都是如此(回答单个问题的最短时间、重试次数等等)

a
b
没有“正确”的值,只有适合您的值。我会为他们玩一些不同的值,看看你的排名列表如何结束,然后决定它们

这是一个常见的问题,当对每个测试有多个数据点的测试结果进行排名时,如何确定哪种数据点更重要


注意:对于两个参数,您实际上不需要两个参数,一个就足够了(就像说
a=1
)。

您可以使用
Promise.race()
Promise.all()
onsubmit
元素的事件

var forms=[].slice.call(document.querySelectorAll(“[id^=form]”),
进度=新日期().getTime();
承诺,种族(
forms.map(函数(表单、索引){
返回新承诺(函数(解析){
表格.附录列表(“提交”,功能(e){
调用(form[form.id,new Date().getTime()-progress]);
});
})
})
)
.然后(功能(res){
console.log(res)
警报(res[0]+“完成测验最快的速度为”+res[1])
});
我保证(
forms.map(函数(表单、索引){
返回新承诺(函数(解析){
表格.附录列表(“提交”,功能(e){
调用(form[form.id,new Date().getTime()-progress]);
});
})
})
)
.然后(功能测试){
如果(测验[0][1]<测验[1][1]){
警报(测验[0][0]+“获胜测验”)
}否则{
警报(测验[1][0]+“获胜测验”)
}
})

用户1
5+5=10
5+6=12
5+2=7
7+7=15
用户2
5+5=10
5+6=12
5+2=7
7+7=15

如果两个用户有相同数量的正确答案,那么完成得最快的那一个应该排名更高。换句话说,按正确答案的数量和时间排序。在我看来,速度较慢但答对问题较多的人应该排名更高。(当然,这是一种给用户列表排序的方法,而不是给一个用户分配一个分数。)给这两个条件一个因子(可能不一样),然后乘以测验的正确答案。所有用户都同时开始测验吗?@nnnnnn这很有意义,多重排序,为什么我把东西弄得复杂,帮忙真是太简单了。注意,我们在这里稍微滥用了sort()函数,因为我们返回true(解释为1)或false(解释为0)“0”实际上意味着“两个值相等”。更标准的方法是
返回b.correct>A.correct | |(b.correct==A.correct&&b.time(但我的原始版本在大多数ECMAScript版本(如果不是所有版本的话)中应该是一样的。这里需要注意的是,最好使用正确的sort实现,返回1或-1,因为在许多情况下,这将自动失败(将返回原始的未排序数组).weight在javascript?@EuniceChia中是一个函数-它的意思是一个等式(并解释为等式)。用户的权重由不同参数的某些组合决定的想法。。。
weight(user) = a * parameter_1 + b *  parameter_2