如何在javascript中找到数组最大值的所有索引?

时间:2014-03-09 23:42:00

标签: javascript arrays max

我试图找到一种方法来获取数组的最大值,然后找到该值的所有索引。我想再重复两次。

我有8个分数的数组。我想找到所有第一名,所有第二名,以及所有第三名。

Array = [0, 400, 300, 400, 300, 200, 100, 200]

第一名指数:1,3

第二名索引:2,4

第三名指数:5,7

我如何在javascript中实现这一目标?

4 个答案:

答案 0 :(得分:1)

以下代码可以解决问题:

var scores = [0, 400, 300, 400, 300, 200, 100, 200];

// make a working copy, so that we can change the working copy
// while doing the calculations without changing the original array
var working = scores.slice(0),
    max,
    indices,
    numberOfPlaces = 3,
    results = []; 

for (var p = 0; p < numberOfPlaces; p++) {
    max = Math.max.apply(null, working);
    indices = [];
    for (var i = 0; i < working.length; i++)
        if (working[i] === max && working[i] > Number.NEGATIVE_INFINITY) {
            indices.push(i);
            working[i] = Number.NEGATIVE_INFINITY;
        }
    results.push(indices);
}

对于您的输入results将是[[1,3], [2,4], [5,7]]。也就是说,results[0]将保留第一名索引,results[1]将保留第二名索引,依此类推。

如果您后来决定只想要前两个位置,或者您想要前五个位置,只需更改numberOfPlaces变量即可。

答案 1 :(得分:1)

假设分数不是大数字,您可以构建“分数到分数”的散列,然后按键排序,并打印出索引:

正在运行的样本:

http://jsfiddle.net/nmA35/2/

代码:

var arr = [0, 400, 300, 400, 300, 200, 100, 200];
var hashValueToPosition = {};
var i;

for (i = 0; i < arr.length; i++) {
    hashValueToPosition[arr[i]] = (hashValueToPosition[arr[i]] || []);
    hashValueToPosition[arr[i]].push(i);
}

// see http://stackoverflow.com/questions/208016/how-to-list-the-properties-of-a-javascript-object  for Object.keys or the following:
var getKeys = function(obj){
   var keys = [];
   for(var key in obj){
      keys.push(key);
   }
   return keys;
}

var arrMaxToMinScores = getKeys(hashValueToPosition).sort().reverse();

for (i = 0; i < arrMaxToMinScores.length; i++) {
    $("body").append("<pre>" + arrMaxToMinScores[i] + ": " + JSON.stringify(hashValueToPosition[arrMaxToMinScores[i]]) + "</pre>");
}

答案 2 :(得分:0)

function awardPrizes(arr){
    var L= arr.length, prizes= [[], [], []], n;

    // save the three highest scores in scores array:
    // eg: [400,300,200]

    var scores= arr.slice().filter(function(n, i){
        return arr.indexOf(n)== i;
    }).sort(function(a, b){ return b-a}).slice(0, 3);

    //put the high scoring indexes in the relevant prizes array:

    arr.forEach(function(itm, i){
        n= scores.indexOf(itm);
        if(n!= -1) prizes[n].push(i);
    });
    return prizes;
    //[first group,second group,third group]

}
var data= awardPrizes([0, 400, 300, 400, 300, 200, 100, 200]);


/*  returned value: (Array)
[
    [1, 3],
    [2, 4],
    [5, 7]
]
    */

答案 3 :(得分:0)

与函数式编程一样?

a={};[0, 400, 300, 400, 300, 200, 100, 200].forEach(
    (el,i) => a[el]? a[el].push(i) : a[el]=[i]
);
Object.keys(a).sort().reverse().map(k => [Number(k),a[k].sort()])

基本上散列所有值,然后按降序排列键,按升序提及索引。例如:

[
    [400,[1,3]],
    [300,[2,4]],
    [200,[5,7]],
    [100,[6]],
    [0,[0]]
]