【问题标题】:How to get the "rank" of a Array entry by it's value?如何通过值获取数组条目的“排名”?
【发布时间】:2016-06-27 21:55:26
【问题描述】:

假设我有以下结构

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

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

  • 这个逻辑只需要处理正整数和零。

我的想法是创建一个通过数组索引返回分数的函数

getScore(Arr[0]); // 1
getScore(Arr[1]); // 0
getScore(Arr[2]); // 2

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

【问题讨论】:

  • 排序,倒序,然后排名1-n。

标签: javascript arrays


【解决方案1】:

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

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

【讨论】:

  • 嗯,有趣!为什么不使用 Array.indexOf 而不是 for 循环,为了整洁?
  • @FilipeMerker -- 你可以这样做,我只是使用常规的for 来提供旧版支持。假设没关系,因为我们使用的是sort :)
  • 编辑使用一些链式事件和indexOf
【解决方案2】:

你描述的'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 之间的唯一区别是它将如何处理原始数组中不存在的值。

【讨论】:

  • +1 表示性能问题。虽然我没有处理大数组,但也许一些未来的用户可能需要这个。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 2021-07-28
  • 2017-09-23
  • 2019-01-06
  • 1970-01-01
  • 2011-05-13
相关资源
最近更新 更多