使用 reduce 确定数组中最小数的索引

Determining index of smallest number in an array using reduce

本文关键字:小数 索引 数组 reduce 使用      更新时间:2023-09-26

目标是创建一个函数,该函数接受两个参数:一个非重复数字数组和一个字符串("value"或"index"),并返回数组中的最小值或数组中最小数字的索引,具体取决于第二个参数。

我真的需要练习回调和一些数组方法,所以我想出了:

function min(arr, toReturn) {  // toReturn takes either 'value' or 'index'
  return arr.reduce(function(sofar, current, index) {
     return (toReturn == 'value') ? Math.min(sofar, current) : arr.indexOf(Math.min(sofar, current));
});}
console.log(min([7,22,3,4,5],'index'));

当设置为"值"时,它可以工作,但为"索引"呈现可怕的-1。

我在语法上哪里出错了?

返回索引时,将上一个调用的索引与下一个成员的值进行比较。在第一次调用中,这将是 0,因为 7 和 22 的最小值是 7,即成员 0:

arr.indexOf(Math.min(7,22))

所以函数返回 0。

在下一个比较中,0 小于 3,arr.indexOf(0)将返回 -1,因为数组中没有零。所有后续调用都返回 -1,并且由于没有 -1,indexOf 返回 -1,无穷大

我认为使用 Math.min 效率低下,请考虑改用小于运算符<,并随时记住最低索引,同时保存对 indexOf 的调用。

下面期望 idx 是布尔值或真/假,这比"索引"或"值"更简单。默认值为返回最小值。

function getLowest(arr, idx) {
  var index = 0, value = arr.reduce(function(pre, cur, i) {
    return cur < pre? (index = i) && cur : pre;
  });
  return idx? index : value;
}
console.log(getLowest([7,22,3,4,5]));       // 3
console.log(getLowest([7,22,3,4,5], true)); // 2

这可能是一两行额外的,但我敢打赌<比>Math.min快;-)

这是可能的实现reduce您提供以初始状态还原对象

{value: Infinity, index: null}

value最小磁彩的价值

index最小指数

在减少时,您将当前项目与最小项目进行比较,如果其较小的更新对象字段循环后只需返回您需要的字段flag

function arrMin(arr, flag) {
  return arr.reduce(function(m, item, index){
    if(item < m.value) {
      m.value = item;
      m.index = index
    }
    return m;
  }, {value: Infinity, index: null})[flag]
}