使用 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]));


慕尼黑的夜晚无繁华
浏览 216回答 3
3回答

喵喔喔

你可以将值与索引一起存储在数组中,按值排序,将排名映射到给定的值和索引,按索引排序得到数组的原始排序,拿排名。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

素胚勾勒不出你

在 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]));

HUX布斯

试试这个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 开始的索引
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript