JavaScript返回数组中最小和最大数字的索引

3

我制定了这个解决方案。

var arr=[4,10,24,3,2,2,19];

var max = arr[0];
var maxIndex = 0;
var min = arr[0];
var minIndex = 0;

for (var i = 1; i < arr.length; i++) {
  if (arr[i] > max) {
    maxIndex = i;
    max = arr[i];
  }
}
for (var i = 1; i < arr.length; i++) {
  if (arr[i] < min) {
    minIndex = i;
    min = arr[i];
  }
}

alert(maxIndex);
alert(minIndex);

有没有更简单的方法完成上述任务?

3
可以简化:你可以在一个循环中完成这个操作。 - Salman A
1
首先,您可以将两个循环合并为一个 for 循环。 - Nikhil Aggarwal
1
你也可以通过摒弃 maxmin,而使用 if (arr[i] > arr[maxIndex])if (arr[i] < arr[minIndex]) 来换取代码大小的性能。 - Erich Kitzmueller
如果您不关心原始数组的顺序,可以先对其进行排序并获取第一个和最后一个元素。 - Luuuud
2个回答

5

使用 reduce 函数时,你可以使用 indexarray 参数:

var arr=[4,10,24,3,2,2,19];

var maxIndex = arr.reduce(function(highestIndex, element, index, array){
    return element > array[highestIndex] ? index : highestIndex;
}, 0);

对于 min 和 max:

var limits = arr.reduce(function(limits, element, index, array){
    limits.max = element > array[limits.max] ? index : limits.max;
    limits.min = element < array[limits.min] ? index : limits.min;
    return limits;
}, { max : 0, min : 0 });
//limits.max === Highest value index,
//limits.min === Lowest value index

1
不过,如果你这样做,仍然需要两个调用reduce。虽然可以用一次调用完成,但那时你就不是真正的“reduce”了,而只是一个“forEach”。 - T.J. Crowder
@T.J.Crowder,为什么需要两个reduce调用? - MinusFour
一个是最小值,一个是最大值,就像你写的那样。 - T.J. Crowder
@T.J.Crowder,你是不是在引入一个数字列表并获取单个值(尽管可以承认,该值是一个集合)? - MinusFour
如果累加器从未更改(在您的更新中确实如此;每次回调传入和传出的只是相同的对象引用),那么您并没有真正进行“reduce”。这只是一个带有传递的累加器的forEach,最终将其传递到函数之外,而不是简单地关闭它。 - T.J. Crowder
显示剩余2条评论

1
这是一种标准的方法(不涉及函数式编程)。当找到最小值和最大值时,只需将循环的当前索引设置为minIndex/maxIndex变量即可。

 function findIndexOfMinMax(arr) {
   let minIndex = 0;
   let maxIndex = 1;
   let min = arr[0];
   let max = arr[1];

   for (let i = 0; i < arr.length; i++) {
     if (arr[i] < min) {
       min = arr[i];
       minIndex = i;
     }
     if (arr[i] > max) {
       max = arr[i]
       maxIndex = i;
     }
   }
   return {
     minIndex,
     maxIndex
   };
 }

 console.log(findIndexOfMinMax([9, 4, -1, -1, 7, 8, 0, 11]))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接