2017-07-05 16 views
1
/* 
Given an array of objects: ID|userName|totalScore|competitionRank, 
number ID 
string userName 
number totalScore 
number competitionRank 
all competitionRanks are set to NULL 
give each score a ranking in descending order 
*/ 

これはすべてのエッジケースを通過するかどうかは現在わかりません。また、これは私がこれを行うことができる最速のようだ、改善の助けが素晴らしいだろう。それは私が考えることができるテストケースに合格しました。どんな助けもありがとう。JavaScriptで目標の配列を指定したランク付けスコア

//Initialize data structure 
 
var playerScores = [ 
 
    { 
 
    "ID": 1, 
 
    "userName": "person1", 
 
    "totalScore": 230, 
 
    "competitionRank": null 
 
    },{ 
 
    "ID": 2, 
 
    "userName": "person2", 
 
    "totalScore": 220, 
 
    "competitionRank": null 
 
    },{ 
 
    "ID":3, 
 
    "userName": "person3", 
 
    "totalScore": 250, 
 
    "competitionRank": null 
 
    },{ 
 
    "ID":4, 
 
    "userName": "person4", 
 
    "totalScore": 230, 
 
    "competitionRank": null 
 
    },{ 
 
    "ID": 5, 
 
    "userName": "person5", 
 
    "totalScore": 250, 
 
    "competitionRank": null 
 
    } 
 
]; 
 

 
playerScores.sort(function(a,b){ 
 
    return b.totalScore - a.totalScore; 
 
}); 
 

 
var numTies = 0; 
 
playerScores[0].rank = 1; 
 
for (i = 1; i < playerScores.length; i++){ 
 
    if (playerScores[i].totalScore === playerScores[i-1].totalScore){ 
 
    numTies++; 
 
    playerScores[i].rank = playerScores[i-1].rank; 
 
    } 
 
    else{ 
 
    playerScores[i].rank = i+numTies; 
 
    numTies = 0; 
 
    } 
 
} 
 

 
console.log(playerScores);

+0

だからあなたは自分のスコアに基づいてオブジェクトをソートしている:

は様々なために、私が代わりにif/elseの三項演算子を使用しましたか?じゃあ何? – Li357

+0

申し訳ありませんが、私の説明の一部が途切れてしまったので、今編集します。 –

+0

あなたは最初にそれらを降順にソートし、それぞれにランクプロパティを与えます - ランクはどのように計算されますか?インデックスだけ? – Li357

答えて

0

私は、配列のインデックス(i)はゼロベースですが、ランクが問題のテストデータのために(1から始まるので、あなたの現在のコードでi + numTiesは、実際に、i + numTies + 1あるべきと考えています唯一の結び付けられていないアイテムは最後だったので、これは問題を引き起こさなかった)。

しかし、結び目のない要素のランクは常に配列内の位置(+1)と同じであるため、numTies変数はまったく必要ありません。

また、最初の項目を実行するループのforより前の行は、配列が空の場合はエラーとなりますので、そのことをテストする必要があります。そしてiを宣言するvarを使用します。

var playerScores = [ 
 
    { "ID": 1, "userName": "person1", "totalScore": 230, "competitionRank": null }, 
 
    { "ID": 2, "userName": "person2", "totalScore": 220, "competitionRank": null }, 
 
    { "ID": 3, "userName": "person3", "totalScore": 250, "competitionRank": null }, 
 
    { "ID": 4, "userName": "person4", "totalScore": 230, "competitionRank": null }, 
 
    { "ID": 5, "userName": "person5", "totalScore": 250, "competitionRank": null } 
 
]; 
 

 
playerScores.sort(function(a,b){ return b.totalScore - a.totalScore; }); 
 

 
if (playerScores[0]) playerScores[0].rank = 1; 
 
for (var i = 1; i < playerScores.length; i++) { 
 
    if (playerScores[i].totalScore === playerScores[i-1].totalScore) { 
 
    playerScores[i].rank = playerScores[i-1].rank; 
 
    } else { 
 
    playerScores[i].rank = i + 1; 
 
    } 
 
} 
 

 
console.log(playerScores);

あなたは0ではなく1からループを開始し、ループ内の最初の要素のためにテストした場合、それはあなたのコードを再構築するオプションを提供しますforループではなく配列の反復関数を使用することができます。これは実行は遅くなりますが(おそらく)読みやすくなります。

var playerScores = [ 
 
    { "ID": 1, "userName": "person1", "totalScore": 230, "competitionRank": null }, 
 
    { "ID": 2, "userName": "person2", "totalScore": 220, "competitionRank": null }, 
 
    { "ID": 3, "userName": "person3", "totalScore": 250, "competitionRank": null }, 
 
    { "ID": 4, "userName": "person4", "totalScore": 230, "competitionRank": null }, 
 
    { "ID": 5, "userName": "person5", "totalScore": 250, "competitionRank": null } 
 
]; 
 

 
playerScores.sort(function(a,b){ return b.totalScore - a.totalScore; }); 
 

 
playerScores.forEach(function(player, i, arr) { 
 
    player.rank = i === 0 || player.totalScore != arr[i-1].totalScore 
 
       ? i + 1 
 
       : arr[i-1].rank; 
 
}); 
 

 
console.log(playerScores);

+0

私はそれが好きです。私がどのようにランクにイテレータを使うことができるのか分からなかった。ありがとう! –

関連する問題