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

Javascript 使用reduce确定数组中最小数的索引,javascript,arrays,callback,reduce,Javascript,Arrays,Callback,Reduce,目标是创建一个包含两个参数的函数:一个非重复数字数组,一个字符串“value”或“index”,并根据第二个参数返回数组中的最小值或数组中最小数字的索引 我真的需要练习回调和一些数组方法,所以我想到了: function min(arr, toReturn) { // toReturn takes either 'value' or 'index' return arr.reduce(function(sofar, current, index) { return (toRetu

目标是创建一个包含两个参数的函数:一个非重复数字数组,一个字符串“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'));
当设置为“value”时,它可以工作,但为“index”呈现可怕的-1


语法方面,这里哪里出了问题?

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

arr.indexOf(Math.min(7,22))
因此函数返回0

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


我认为使用Mth.min是低效的,考虑使用小于运算符

这是可能的实现与减少。 您可以使用初始状态来减少对象

{值:无穷大,索引:null}

最小元素的值

索引最小元素索引

在reduce上,将curren项与minimal和if较小的update对象字段进行比较 循环结束后,只需按标志返回所需的字段


第二个参数用于什么?如果需要查找最小数组元素的索引,那么第二个参数看起来很奇怪。这是函数的本质:它查看第二个参数字符串,以返回最小值本身“value”或最小值的索引“index”哦,这只是一个标志,我们应该返回最小值本身还是数组中的索引?是的。toReturn=='value'时的最小值,以及toReturn=='index'时数组中的索引为什么要将索引初始化为null?既然您将值设置为可能的最高值,为什么不将索引设置为可能的最低索引,即0?或者-1?顺便说一句,这并没有回答OP:我哪里做错了…@RobG只是为了避免在找不到元素时与inArray结果间接关联。但是可以使用'-1'作为首字母value@RobG,题名告诉抽象题确定指标。。。因此,我的答案是如何实现这一目标的可能实现。关于“我哪里做错了…”我认为这是减少回调的错误方法,这就是为什么我提供了另一个回调的原因。这里是下意识的——如果他们没有看到OP的明确答案,他们会让人感觉到他们的存在,不要期望他们解释原因。当然不是我-@RobG lol:无论如何,谢谢你的提醒,如果OP对另一种方法感兴趣,那就意味着我没有花时间打字,否则我会受到额外的同伴压力,你说得对;每次调用时都会调用indexOf,我本来打算只在达到最终最小值时调用它。。。;回报指数?arr.indexOfvalue:value;。但我宁愿避免打电话给indexOf-
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
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]
}