在jQuery中对用户分数进行排名

ven*_*t14 0 jquery

我有一个由600条记录组成的数组,格式为:

[ Mac     14
  John    12
  abc     12  
  bill    16  ]
Run Code Online (Sandbox Code Playgroud)

我正在尝试为上面创建一个排名模型,在某种意义上,bill有rank1,mac为rank 2,john,abc为rank3并将其推回到数组.例如

[ Mac     14  2
  John    12  3
  abc     12  3
  bill    16  1 ]
Run Code Online (Sandbox Code Playgroud)

以下是我尝试过的代码:

    var items = data.d.results;

if(items.length > 0){
for (i = 0; i < items.length; i++) { 
 playerDetails.push( items[i].Title , items[i].Points );    
 }
 var scores = playerDetails.map(function(d) { return d[1]; }).sort().reverse();
   console.log(playerDetails);  
Run Code Online (Sandbox Code Playgroud)

初始的playerdetails数组包含以下格式的数据:

{John, Nikhil C.,467},{Cule, Mac A.,341},{Pat, Ryan,465}

  [
      [0...99]: [
         [0...9]: [
            0: "{John, Nikhil C.",
            1: "467}",
            2: "{Cule, Mac A.",
            3: "341}",
            4: "{Pat, Ryan",
            5: "465}",

         ],
Run Code Online (Sandbox Code Playgroud)

这在jQuery中是否可行?如果是的话,如何实现呢?谢谢

Dav*_*und 5

这在javascript中是可能的,不需要jQuery.

此示例引入了一个新的分数数组,用于排序目的:

var data = [['Mac', 14],['John', 12],['abc',12],['bill',16]];

var scores = data.map(d => d[1]).sort().reverse();
data = data.map(d => d.concat([scores.indexOf(d[1])+1]));
Run Code Online (Sandbox Code Playgroud)

如果您不介意根据分数对整个数据集进行排序,则可以完全在原始数据中进行操作.然后,您可以在迭代中使用当前位置进行排名,并仅检查当前项目与前一项目排名相同的极端情况:

data
  .sort((a,b) => b[1] - a[1])
  .forEach((d,i,a) => d.push(i > 0 && a[i-1][1] == d[1] ? a[i-1][2] : i+1));
Run Code Online (Sandbox Code Playgroud)

  • [箭头功能](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions)是函数声明的ECMAScript 6简写.它可以在[除IE之外的所有现代浏览器]中使用(http://caniuse.com/#feat=arrow-functions),但大多数情况下我认为在这个论坛中传达想法很有用,而不会用冗长的语法混淆代码.您可以将`map(d => d [1])`重写为`map(function(d){return d [1];})`等. (2认同)