Generating ranking numbers by

Given a set Objects

with a name and rating each:

[
    {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"}
]

      

How would I generate the ranking number like this:

[
    {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"}
]

      

Since some of them link objects, they get the same number, and the numbers after offset.

+3


source to share


1 answer


Array.map

with some logic will do the trick:

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;
});

      

Demo: http://jsfiddle.net/s0zvfubn/1/



var data = [
    {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"}
]

var ranked = data.map(function(item, i) {
    if (i > 0) {
        var prevItem = data[i - 1];
        if (prevItem.score == item.score) {
            item.rank = prevItem.rank;
        } else {
            item.rank = i + 1;
        }
    } else {
        item.rank = 1;
    }
    
    return item;
});

document.write('<pre>' + JSON.stringify(ranked, null, 4) + '</pre>');
      

Run codeHide result


+3


source







All Articles