金,银,铜的逻辑

时间:2011-01-25 14:53:48

标签: javascript sorting

我正在使用javascript构建游戏并生成结果。

var score = array("5", "5", "1");

因此,玩家1得分为5,玩家2得分为5,玩家3得分为1。

我希望将我的结果显示为3个等级 - 金牌,银牌和铜牌,但如果前两个结果相同,我希望它们都是黄金,留下最低分银。

使用javascript解决此问题的最佳方法是什么?

理想情况下,我对这一特定分数的结果数组如下所示:

var results = array("gold", "gold", "silver");

感谢。

5 个答案:

答案 0 :(得分:1)

以下是一些代码:

var scores = [5, 8, 1];
scores.sort(function(a, b) {
    return (a > b) ? 1 : ((a < b) ? -1 : 0);
}).reverse();
var medals = {};
var medalsUsed = 0;
var availableMedals = ['Gold', 'Silver', 'Bronze'];
for(var i = 0; i < scores.length; i++) {
    var score = scores[i];
    var medal;
    if(medals[score]) { // already have a medal for this score value? use it
        medal = medals[score];
    }
    else { // use next available medal
        if(i >= 3) return; // but not if we've already given out 3 medals
        medal = availableMedals.shift();
        medals[score] = medal;
    }

    alert('medal for ' + i + ': ' + medal);
}

演示:http://jsfiddle.net/ASdb8/1/

答案 1 :(得分:1)

我首先对数组进行排序,然后比较值(1表示2,2表示3)。要对数字数组进行排序,您需要将sort函数作为参数传递给另一个函数。

var medals = ['Gold', 'Silver', 'Bronze']; 

score = score.sort(compare);

//Return descending order
function compare(a,b){
    return b-a;
}

results[0] = medals.shift();
//I'm assuming you only want top 3  scores    
for(var i = 1; i < 3; i++){
    if(score[i] == score[i-1]){
        results[i] = results[i-1];
    }else{
        results[i] = medals.shift();
    }
}

此代码对分数进行排序,如果它们中的任何一个相等,则将奖章设置为与之前的分数相同。

概念证明:http://jsfiddle.net/Fttmj/1/

答案 2 :(得分:0)

首先遍历数组并确定最高和接下来的两个最高分数。

然后循环播放您的玩家分数并将“Gold”分配给与最高分相匹配的任何分数,将“Silver”分配给与第二高分相匹配的任何分数,将“Bronze”分配给与第三高分相匹配的任何分数。

答案 3 :(得分:0)

另一个解决方案是使用Javascript的max()函数,然后比较金/银和铜/银分数。如果金银相等,将银变为金,青铜变为银,如果银和青铜相等,则将青铜变为银。

答案 4 :(得分:0)

另一种方法

var results = ['Gold', 'Silver', 'Bronze'];
var arr = [5, 5, 5];
arr.sort().reverse();
var currentScore = arr[0];
var idx = 0;
for(var i=0; i< arr.length; i++){
    if(arr[i]!= currentScore){
        idx++;
        currentScore = arr[i];
    }
    alert(arr[i]+ ' has ' + results[idx] + ' medal');
}

更新:fiddle here