返回数组中最大值的索引

Return indexes of greatest values in an array

本文关键字:索引 最大值 数组 返回      更新时间:2023-09-26

我想要一个返回数组最大值的函数。我知道这个问题被问了很多次,但是在一个数组中我们有多个最大值的情况下呢?假设我们的数组看起来像这样:

var arr = [1,10,2,10];

功能:

arr.indexOf(Math.max.apply(Math, arr) );

将只返回索引 1,但我想得到 1 和 3。

什么是

最短和最有效的方法。

const largest = Math.max(...arr);
arr.reduce((indexes, n, index) => {
  return indexes.concat(n === largest ? [index] : []);
}, []);

或者,如果 ES5 是你的一杯茶:

var largest = Math.max.apply(Math, arr);
arr.reduce(function(indexes, n, index) {
  return indexes.concat(n === largest ? [index] : []);
}, []);

或者,如果你喜欢泛型函数:

function findAllIndexes(arr, val) {
  return arr.reduce((indexes, element, index) => {
    if(element === val) {
      return indexes.concat([element]);
    } else {
      return indexes;
    }
  }, []);
}
findAllIndexes(arr, Math.max(..arr));

"手动"方式:

    var getIndicesOfHighest = function(arrIn) {
        var indices = [];
        var highest = arrIn[0];
        for (var el=1; el<arrIn.length; el++) {
            if(arrIn[el] > highest) {
                highest = arrIn[el];
                indices = [];
                indices.push(el);
            } else if ( arrIn[el] == highest) {
                indices.push(el);
            }
       }
       return indices;
   }

这将起作用:

var arr = [1,10,2,10],
    indices = [],
    highest = Math.max.apply(Math, arr);
arr.forEach(function(val, index){
    if (val === highest) indices.push(index);
});
console.log(indices.join(','));

你可以使用它。

var arr = [1,10,2,10];
var ind = [];
var highValue = Math.max.apply(Math, arr);
arr.map(function(x, i) {
    if (x == highValue) {
    ind.push(i)
  }
});
console.log(ind);//output is [1,3]

var highestIndexes = [];
$.each(arr,function(index,item){
   item== Math.max.apply(Math, arr) ? highestIndexes.push(index) : $.noop();
});
console.log(highestIndexes);

试试这个

只是为了完整起见,一个带有Array#reduce()的提案

var arr = [1, 10, 2, 10],
    max = arr.reduce(function (r, a, i, aa) {
        if (!i || a > aa[r[0]]) {
            return [i];
        }
        if (a === aa[r[0]]) {
            r.push(i);
        }
        return r;
    }, []);
document.write('<pre>' + JSON.stringify(max, 0, 4) + '</pre>');

使用 underscore/lodash 和 _.reduce 你可以编写一个方法,根据你传入的任何条件来查找所有索引。

喜欢:

function findAllIndexes(_arr, condition) {
  return _.reduce(_arr, function(arr, o, index) {
    if(condition(o, _arr)) arr.push(index);
    return arr;
  }, []);
}
console.log(findAllIndexes(nums, function(o, arr){
  return o === Math.max.apply(Math, arr);
}));

同样的方法可以与对象文本数组一起使用,无论您给它什么条件

喜欢

var users = [
  { 'user': 'barney',  'active': true },
  { 'user': 'barney',    'active': false },
  { 'user': 'bob', 'active': false }
];
console.log(findAllIndexes(nums, function(o, arr){
  return o.user == 'barney' && o.active == false;     
}));

http://jsbin.com/jadesayicu/edit?html,js,console,output