Javascript返回数组中最大值的所有索引

时间:2019-03-21 16:14:10

标签: javascript

我正在尝试获取数组中最高值“ 全部”的索引:

let env;
const props = ["customEnvironment", "dev", "qa", "staging", "prod"];
for (let i = 0; i < props.length; i++) {
    if (argv[props[i]]) {
        env = props[i];
        break;
    }
}

需要返回[0,1,4,3,4]

更新:谢谢大家的快速答复。在阅读了一些较早的评论之后,它为我产生了以下路径:

[2,4]

我知道这有点冗长,但这对我来说很有意义。我最好阅读“ 减少”。

9 个答案:

答案 0 :(得分:4)

这里的想法是

  • 首先使用math.max找到最大值
  • 如果值与max相同,现在循环遍历数组并添加索引。

let arr = [0,1,4,3,4]
let max = Math.max(...arr)

let op = []
for(let i=0; i<arr.length; i++){ 
 if(arr[i] === max){
    op.push(i)
  }
}
console.log(op)

另一种替代方法是使用reduce和变量来跟踪最大值,然后访问max键的值

let arr = [0,1,4,3,4]
let max = null

let op = arr.reduce((op,inp,index)=>{
   op[inp] = op[inp] || []
   op[inp].push(index)
   if(inp > max){
    max = inp
   }
   return op
},{})
console.log(op[max])

答案 1 :(得分:4)

使用Math.max可以获得最大元素。发布您在数组上的映射并获取此max元素的索引。这种方法的复杂性是 O(n);

const arr = [0,1,4,3,4];
const max = Math.max(...arr);
const res = [];
arr.forEach((item, index) => item === max ? res.push(index): null);
console.log(res);

答案 2 :(得分:2)

首先使用cli <- SolrClient$new(host = "api.plos.org", path = "search", port = NULL) solr_facet(cli, params = list(q='alcohol', facet.pivot='journal,subject', facet.pivot.mincount=10)) 查找最大值,然后找到索引:

reduce

答案 3 :(得分:1)

这是一个相当简单的版本。获得最大值后,遍历列表以测试每个匹配项,如果相等则添加索引:

const allMax = (xs, max = Math.max(...xs)) => 
  xs.reduce((all, x, i) => x == max ? [...all, i] : all, [])

console.log(allMax([0, 1, 4, 3, 4]))

您可以解决此问题以使其一次运行(跳过Math.max调用),但是代码会更复杂。

更新

这是我提到的第二个版本:

const allMax = (xs) => xs.reduce(
  (a, x, i) => x > xs[a[0]] ? [i] : x < xs[a[0]] ? [...a] : [...a, i],
  [0]                                
)

console.log(allMax([0, 1, 4, 3, 4]))

一次完成所有操作。如果您提供一个空列表,它将返回[0],这可能是一个问题,但是很难知道该如何处理。一个优点是它将在其他类型的输入上运行。 allMax(['a', 'b', 'd', 'c', 'd']) //=> [2, 4]。日期也应该起作用,或者您可以与<进行比较的任何事物。

它并没有我想象的那么复杂。

答案 4 :(得分:1)

这是一个稍微冗长的解决方案,仅迭代一次。这个想法是让您跟踪看到的最高价值,并与之进行比较。

let arr = [0,1,4,3,4];
let maxValue = arr[0];
let maxIndexes = [];

arr.forEach((val, index) => {
  if(maxValue === val){
    maxIndexes.push(index);
  }

  if(maxValue < val){
    maxValue = val;
    maxIndexes = [index];
  }
})

console.log(maxIndexes);

答案 5 :(得分:1)

简单地,找到最大值

var max_val = Math.max.apply(null, array)

然后使用reduce函数

var max_val_indexes = arr.reduce(function(arr, ele, i) {
    if(ele === max_val)
        arr.push(i);
    return arr;
}, []);

答案 6 :(得分:1)

要获得预期结果,请使用以下选项

  1. 使用地图遍历
  2. 捕获最大索引值
  3. 过滤出最大索引值

var arr = [0,1,4,3,4]

const maxIndex = arr
  .map((v, i, self) => v === Math.max(...self) ? i : -1)
  .filter(index => index !== -1);

console.log(maxIndex)

答案 7 :(得分:1)

没有理由找到最大值,然后再次遍历数组 。您只需遍历数组一次

即可跟踪当前最大值

let arr =  [0,1,4,3,4]

let maxIndexes = arr.reduce((maxes, n, i, a) => {
    let cur = a[maxes[0]]  // current max value
    if (cur == undefined || n > cur) return [i]
    return (cur == n) ? maxes.concat(i) : maxes
}, [])


console.log(maxIndexes)

答案 8 :(得分:0)

您可以得到两个数组,一个是重复的格言,另一个是格数的索引。请检查以下代码,它可能对您有帮助

let a = [1,3,6,6]
Math.max.apply( Math, a );
let index =[];
let y=0;
let maxValue = a.reduce( function (value,obj){
  if(Math.max.apply( Math, a) == obj){
    	index.push(y);
 		 	value.push(obj);
  }
  ++y;
  return value;
},[]);

console.log(maxValue);
console.log(index);