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>');
+3
source to share