根据初始数组返回一个新的排名数组

时间:2020-05-09 18:22:12

标签: javascript arrays sorting

我是javascript新手,正在尝试创建一个可以接受任何长度数组的函数,并使用该数组的排名创建一个新数组(即[10,5,20]将输出[2,3 ,1]。到目前为止,这是我的代码(我最初尝试使用一系列较大的for循环来每次查找最大值,但遇到了使它们重复与数组中存在数字相同的次数的问题,所以我切换了整理方法。让我知道是否有人可以帮助我指出正确的方向,谢谢!!

function rankings(array){
  let finalArray = [];
 for (i = 0; i < array.length; i++) {//set up final array
  finalArray[i] = array[i];
   }
  for(let list of array){
    array.sort((a,b)=>b-a)//array sorted in order
    }
    for (i = array.length-1; i>=0; i--){

    }
  return finalArray;
}

3 个答案:

答案 0 :(得分:0)

根据您的排名逻辑(在这种情况下递减),对数组的克隆(通过传播)进行排序。使用Array.map()创建[value,index + 1]的元组,并从元组生成Map

在原始数组上使用Array.map(),然后从Map返回相应的等级:

function rankings(array) {
  const ranks = new Map([...array].sort((a, b) => b - a)
    .map((v, i) => [v, i + 1]))

  return array.map(v => ranks.get(v));
}

const result = rankings([10, 5, 20]);

console.log(result);

要忽略重复值,请在散布前从原始数组创建一个Set

function rankings(array) {
  const ranks = new Map([...new Set(array)].sort((a, b) => b - a)
    .map((v, i) => [v, i + 1]))

  return array.map(v => ranks.get(v));
}

const result = rankings([10, 5, 20, 5]);

console.log(result);

答案 1 :(得分:0)

如果您希望通过相同的值获得相同的排名,cou可以将存储的值用于映射。

const
    rankings = array => array.map(
        Map.prototype.get,
        [...array]
            .sort((a, b) => b - a)
            .reduce((i => (m, v) => m.set(v, m.get(v) || i++))(1), new Map)
    );

const result = rankings([10, 5, 20, 5]);

console.log(result);

答案 2 :(得分:0)

您可以尝试一下:

var data = [10, 5, 20, 5, 4, 25];
var sorted = [...new Set([...data].sort((a,b)=>b-a))] // sorting and filtering the data
var result = data.map(elem=> getIndex = sorted.findIndex(v=>v==elem)+1);
console.log(result);