假设我有以下结构
var Arr = [
{value: 2},
{value: 4},
{value: 1}
]
好的,现在我想通过给它们得分0 -> n
(数组大小可变)来“排名”这个值,其中最大值得到最低分(0),最低值得到最大值得分(n)。
我的想法是创建一个按数组索引
返回分数的函数getScore(Arr[0]); // 1
getScore(Arr[1]); // 0
getScore(Arr[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之间的唯一区别在于它将如何处理原始数组中不存在的值。