我是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;
}
答案 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);