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

时间:2014-12-17 06:02:59

标签: javascript arrays callback reduce

目标是创建一个函数,它接受两个参数:一个非重复数字的数组,一个字符串('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'渲染dreaded -1。

我在这里出错了语法吗?

2 个答案:

答案 0 :(得分:0)

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

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

所以函数返回0。

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

我认为使用 Math.min 是低效的,请考虑使用小于运算符<并记住最低的索引,保存对 indexOf的调用< / em>也。

以下要求 idx 是布尔值或truthy / falsey,它比'index'或'value'更简单。默认值是返回最小值。

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

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

答案 1 :(得分:0)

以下是reduce的可能实施方式 您提供了使用初始状态减少对象

{value: Infinity, index: null}

value minimal elem的值

index最小元素索引

在减少时,您将当前项目与minimal和较小的更新对象字段进行比较 在循环之后,只需返回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]
}