我如何获得数组中五个最高数字的索引

时间:2019-03-19 19:35:41

标签: javascript

我需要一个返回具有五个位置的数组的方法。该数组的编号按顺序表示参数中数组最高编号的索引。我有这个,但我认为有一种更好的方法。

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

数组中的数字可以重复。

4 个答案:

答案 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()indexvalue创建对象数组
  • 然后使用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) );