为了账号安全,请及时绑定邮箱和手机立即绑定

使用 JavaScript 对数组中的数字进行排名

使用 JavaScript 对数组中的数字进行排名

给定一个唯一数字数组,返回原始数组的新排名数组。例如,如果您的输入数组是[10, 5, 20],则输出应该是[2, 3, 1],因为10它是第二大数字,5是第三大数字,并且20是最大的。我的答案是返回[1,2,0]而不是[2,3,1]. 我想不出我哪里错了?function rankings(arr) {  // add whatever parameters you deem necessary   var sorted = arr.slice().sort(function(a, b) {    return b - a  })  var ranks = arr.slice().map(function(v) {    return sorted.indexOf(v)  });  return ranks;}console.log(rankings([10, 5, 20]));
查看完整描述

3 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

你可以

  • 将值与索引一起存储在数组中,

  • 按值排序,

  • 将排名映射到给定的值和索引,

  • 按索引排序得到数组的原始排序,

  • 拿排名。

function rankings(array) {

    return array

      .map((v, i) => [v, i])

      .sort((a, b) => b[0] - a[0])

      .map((a, i) => [...a, i + 1])

      .sort((a, b) => a[1] - b[1])

      .map(a => a[2]);

}


console.log(rankings([10, 5, 20])); // 2 3 1


查看完整回答
反对 回复 2022-06-09
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

在 ES6 中变得更容易:


function rankings(arr) {

  const sorted = [...arr].sort((a, b) => b - a);

  return arr.map((x) => sorted.indexOf(x) + 1);

};


console.log(rankings([10, 5, 20]));


考虑多个重复条目的另一种方法。


function rankDuplicate(arr) {

  const sorted = [...new Set(arr)].sort((a, b) => b - a);

  const rank = new Map(sorted.map((x, i) => [x, i + 1]));

  return arr.map((x) => rank.get(x));

}


console.log(rankDuplicate([10, 10, 5, 20]));


查看完整回答
反对 回复 2022-06-09
?
HUX布斯

TA贡献1876条经验 获得超6个赞

试试这个


function rankings(arr){

  // add whatever parameters you deem necessary....good luck! 

  var sorted = arr.slice().sort(function(a,b){return b-a})

  var ranks = arr.slice().map(function(v){ return sorted.indexOf(v) + 1});

  return ranks;

}


rankings([10, 5, 20]); // [2, 3, 1]

我只是将 1 添加到从 0 开始的索引


查看完整回答
反对 回复 2022-06-09
  • 3 回答
  • 0 关注
  • 215 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信