我需要一个返回具有五个位置的数组的方法。该数组的编号按顺序表示参数中数组最高编号的索引。我有这个,但我认为有一种更好的方法。
function calculateHighests(array){ // in array[array.lentgth-1] is saved a very low number
var max1=max2=max3=max4=max5=array.length-1;
for(var i=0;i<array.length;i++){
if(array[i]>array[max5]){
if(array[i]>array[max4]){
if(array[i]>array[max3]){
if(array[i]>array[max2]){
if(array[i]>array[max1]){
max1=i;
} else {
max2=i;
}
} else {
max3=i;
}
} else {
max4=i;
}
} else {
max5=i;
}
}
}
res = [max1,max2,max3,max4,max5];
return res;
}
var inp = [2, 4, 6, 5, 1, 3, 7, 8, 0];
var out = calculateHighests(inp);
console.log(out);
数组中的数字可以重复。
答案 0 :(得分:3)
您可以首先Array.prototype.sort()
数组,然后使用Array.prototype.map()
获取索引数组
function findMaxPositions(arr,n){
return arr.slice(0).sort((a,b) => b-a).slice(0,n).map(x => arr.indexOf(x));
}
console.log(findMaxPositions([0,3,7,1,8,3,5,0,2,9],5));
如果数字可以重复,请执行以下步骤:
map()
和index
和value
创建对象数组sort()
根据值对数组进行排序slice()
获取第一个5
元素map()
将对象数组转换为索引数组
function findMaxPositions(arr,n){
return arr.map((val,ind) => ({val,ind})).sort((a,b) => b.val-a.val).slice(0,n).map(x => x.ind);
}
console.log(findMaxPositions([1,1,1,1,1],5))
答案 1 :(得分:1)
您可以对数组进行排序并保留索引:
const calculateHighest = arr => arr
.map((v, i) => ({ v, i }))
.sort((a, b) => a.v - b.v)
.slice(0, 5)
.map(({ i }) => i);
答案 2 :(得分:0)
您可以sort
Object.entries()
返回的索引值对数组,然后使用slice
获得前5个索引
let array = [10, 5, 7, 0, 4, 3, 8]
let output = Object.entries(array)
.sort((a, b) => b[1] - a[1])
.slice(0, 5)
.map(a => +a[0])
console.log(output)
答案 3 :(得分:0)
另一种选择是对索引进行排序:
var arr = [0,3,7,1,8,3,5,0,2,9];
var result = Object.keys(arr).sort(function(a, b) { return arr[b] - arr[a]; })
.slice(0, 5).map(Number);
console.log( JSON.stringify(result) );