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

时间:2016-07-05 06:01:57

标签: javascript algorithm math

我正在写一个迷你游戏,但最终还是坚持了下来。这是一个简单的测验,它根据正确回答的问题数量和完成问题所花费的时间对用户进行排名。

我可以轻松地根据谁回答最多问题对用户进行排名,但如何根据2个条件计算出谁是最佳表现者呢?

3 个答案:

答案 0 :(得分:2)

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

示例:

".field": {
    left: "5%",
    width: Titanium.UI.FILL,
    borderRadius: 5,
    hintTextColor: "#aaa",
    color: "#333",
    backgroundColor: "white"
}

输出:

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

答案 1 :(得分:0)

使用两个条件的相对权重。

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

weight(user) = a * parameter_1 + b *  parameter_2

在您的情况下,参数为number_of_correct个答案和time_spent,但对于任意数量的参数(回答单个问题的最短时间,重试次数等)都是如此。

没有&#34;正确&#34;价值为ab,只适用于您。我会为它们玩一些不同的值,看看你的排名列表如何结束,然后决定它们。

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

注意:对于两个参数,你真的不需要两个参数,一个是足够的(与说a=1相同)。

答案 2 :(得分:0)

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

&#13;
&#13;
var forms = [].slice.call(document.querySelectorAll("[id^=form]")),
progress = new Date().getTime();

Promise.race(
  forms.map(function(form, index) {
    return new Promise(function(resolve) {
      form.addEventListener("submit", function(e) {
        resolve.call(form, [form.id, new Date().getTime() - progress]);
      });
    })
  })
)
.then(function(res) {
  console.log(res)
  alert(res[0] + " completed quiz fastest at " + res[1])
});

Promise.all(
  forms.map(function(form, index) {
    return new Promise(function(resolve) {
      form.addEventListener("submit", function(e) {
        resolve.call(form, [form.id, new Date().getTime() - progress]);
      });
    })
  })
)
.then(function(quiz) {
  if (quiz[0][1] < quiz[1][1]) {
    alert(quiz[0][0] + " wins quiz")
  } else {
    alert(quiz[1][0] + " wins quiz")
  }
})
&#13;
<form id="form1">
  <label>user 1</label>
  5+5=10<input name="correct1" type="checkbox" required>
  5+6=12<input name="incorrect1" type="checkbox" required>
  5+2=7<input name="correct2" type="checkbox" required>
  7+7=15<input name="incorrect2" type="checkbox" required>
  <input type="submit">
</form>
<form id="form2">
  <label>user 2</label>
  5+5=10<input name="correct1" type="checkbox" required>
  5+6=12<input name="incorrect1" type="checkbox" required>
  5+2=7<input name="correct2" type="checkbox" required>
  7+7=15<input name="incorrect2" type="checkbox" required>
  <input type="submit">
</form>
&#13;
&#13;
&#13;