質問: ### 前提・実現したいこと javascriptを使ってランキングの順位を表示する仕組みを実装したい。 **■前提条件** データベースはニフティのmBaasのデータストアを使用 **■参考** ニフティ公式ドキュメント(基本的な使い方) ニフティ公式ドキュメント(ランキングを作る) DBに名前とスコアなどを登録していき、それをランキングとして表示したい。 DBへの登録は公式APIを使って実装しており、 スコア順にソートしてデータを抽出することは可能です。 ### 発生している問題 当初、HTMLで出力する際のループ処理を行うときに、配列のインデックスを使って、 順位の番号を書き出そうとしていましたが、その場合だと同点のときの同率順位の時に、 順位の表記がおかしくなってしまいます。 例) 10点 1人 9点 2人 8点 3人 7点 1人 などの時に、 1位 ○○○○さん 2位 XXXXさん 2位 △△△△さん 4位 ●●●●●さん 4位 ▲▲▲▲▲さん 4位 ■■■■■さん といった表示を行いたいです。 ニフティのデータストアでは、SQLを使ってデータの登録ができないので、PHPなどで集計を行ってからデータを登録するのは難しいと思うので、 下記のようなデータをAPIで引っ張ってきて、データを加工して表示を行おうかと思っております。 ``` [ {score:10,name:○○○○}, {score:8,name:●●●●●}, {score:9,name:XXXX}, {score:8,name:▲▲▲▲▲}, {score:9,name:△△△△}, {score:8,name:■■■■■} ] ``` ### 補足情報(言語/FW/ツール等のバージョンなど) フロントエンドはReact+reduxで実装を行っております。 --- javascriptでどういったアルゴリズムでデータを加工すればよいかわからなかったため、お教えいただけると幸いです。
回答: とりあえずこんな感じとか。 ``` let scores = [ {score:10,name:"○○○○"} , {score:8,name:"●●●●●"} , {score:9,name:"XXXX"} , {score:8,name:"▲▲▲▲▲"} , {score:9,name:"△△△△"} , {score:8,name:"■■■■■"} ]; scores = scores.sort( ( a, b ) => { var x = a[ 'score' ]; var y = b[ 'score' ]; if ( x > y ) { return -1; } if ( x < y ) { return 1; } return 0; } ); let count, tmp; scores.forEach( ( item, index ) => { if ( item.score !== tmp ) { count = index + 1; tmp = item.score; } console.log( 'count:', count, ', name:', item.name, ', score:', item.score ); } ); ``` **動くサンプル:**