如何通过它的值获得数组条目的“等级”?

时间:2016-06-27 21:55:27

标签: javascript arrays

假设我有以下结构

var Arr = [
  {value: 2},
  {value: 4},
  {value: 1}
]

好的,现在我想通过给它们得分0 -> n(数组大小可变)来“排名”这个值,其中最大值得到最低分(0),最低值得到最大值得分(n)。

  • 这个逻辑只需要使用正整数和零。

我的想法是创建一个按数组索引

返回分数的函数
getScore(Arr[0]); // 1
getScore(Arr[1]); // 0
getScore(Arr[2]); // 2

但我真的被困住了,不知道怎么做。

2 个答案:

答案 0 :(得分:2)

运行排序功能 - 然后只取每个位置的索引作为它的排名:

function getScore(array, val) {
    return array.sort(function(a, b) {
        return b.value - a.value;
    }).map(function(item) { 
        return item.value;
    }).indexOf(val);
}

getScore(Arr, Arr[0].value) //1

答案 1 :(得分:1)

您描述的'rank'函数等同于询问“此数组中有多少条目大于给定值?”

这是一个替代实现,采用简单计数的方法:

function getScore(array, val) {
    var score=0;
    for(var i=0; i<array.length; i++)
      if (array[i].value > val) 
        score++;
    return score;
}

var Arr = [
  {value: 2},
  {value: 4},
  {value: 1}
]
console.log('getScore(Arr, Arr[0].value) →', getScore(Arr, Arr[0].value));
console.log('getScore(Arr, Arr[1].value) →', getScore(Arr, Arr[1].value));
console.log('getScore(Arr, Arr[2].value) →', getScore(Arr, Arr[2].value));

对于大型阵列来说这会更快一些,因为它不必对阵列进行排序,并且它与不支持map功能的旧版浏览器更兼容。此实现与tymeJV's之间的唯一区别在于它将如何处理原始数组中不存在的值。