按值生成排名数字

Poy*_*oyo 4 javascript sorting

给定一组Objects带有名称和分数的集合:

[
    {score: 14, name:"apple"}
    {score: 13, name:"orange"}
    {score: 11, name:"banana"}
    {score: 11, name:"cabbage"}
    {score: 11, name:"bread"}
    {score: 2,  name:"cherry"}
    {score: 2,  name:"cheese"}
]
Run Code Online (Sandbox Code Playgroud)

我将如何生成这样的排名数字:

[
    {rank: 1, score: 14, name:"apple"}
    {rank: 2, score: 13, name:"orange"}
    {rank: 3, score: 11, name:"banana"}
    {rank: 3, score: 11, name:"cabbage"}
    {rank: 3, score: 11, name:"bread"}
    {rank: 6, score: 2,  name:"cherry"}
    {rank: 6, score: 2,  name:"cheese"}
]
Run Code Online (Sandbox Code Playgroud)

因为其中一些对象并列,所以它们得到相同的数字,而后面的则被抵消。

tym*_*eJV 6

Array.map 用一些逻辑就能解决问题:

var ranked = data.map(function(item, i) {
    if (i > 0) {
        //Get our previous list item
        var prevItem = data[i - 1];
        if (prevItem.score == item.score) {
            //Same score = same rank
            item.rank = prevItem.rank;
        } else {
            //Not the same score, give em the current iterated index + 1
            item.rank = i + 1;
        }
    } else {
        //First item takes the rank 1 spot
        item.rank = 1;
    }

    return item;
});
Run Code Online (Sandbox Code Playgroud)

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

var ranked = data.map(function(item, i) {
    if (i > 0) {
        //Get our previous list item
        var prevItem = data[i - 1];
        if (prevItem.score == item.score) {
            //Same score = same rank
            item.rank = prevItem.rank;
        } else {
            //Not the same score, give em the current iterated index + 1
            item.rank = i + 1;
        }
    } else {
        //First item takes the rank 1 spot
        item.rank = 1;
    }

    return item;
});
Run Code Online (Sandbox Code Playgroud)