【问题标题】:Determining index of smallest number in an array using reduce使用reduce确定数组中最小数字的索引
【发布时间】:2014-12-17 06:02:59
【问题描述】:

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

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

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。

我在语法方面哪里出错了?

【问题讨论】:

  • 第二个参数是干什么用的?如果你需要找到最小数组元素的索引,第二个参数看起来很奇怪..
  • 这是函数的本质:它查看第二个参数(字符串)以返回最小值本身('value')或最小值的索引('index')
  • 哦,所以它只是一个标志,我们应该返回最小值本身还是它在数组中的索引?
  • 是的。 toReturn == 'value' 时的最小值及其在 toReturn == 'index' 时在数组中的索引

标签: javascript arrays callback reduce


【解决方案1】:

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

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

所以函数返回 0。

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

我认为使用 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 快。 ;-)

【讨论】:

  • 你是对的;每次调用都会调用 indexOf,我原本打算仅在达到最终(最小)数字时才调用它。
  • 酷,所以说var value = arr.reduce(...); return index? arr.indexOf(value) : value;。但我更愿意避免调用 indexOf。 ;-)
【解决方案2】:

这是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]
}

【讨论】:

  • 为什么将 index 初始化为 null?既然您将 value 设置为可能的最高值,为什么不将 index 设置为可能的最低索引(即 0)?或者也许是-1?顺便说一句,这并没有回答 OP:“我哪里错了……”。
  • @RobG 只是为了避免与 inArray 结果的间接关联,如果找不到 elem。但是可以使用'-1'作为初始值
  • @RobG,问题标题告诉抽象问题Determining index ...,所以我的回答是如何实现这一目标的可能实现。关于“我哪里错了……”我认为减少回调的方法是错误的,这就是我提供另一个方法的原因
  • 如果没有看到对 OP 的明确回答,有些人会下意识地表现出自己的存在,不要指望他们解释原因。当然不是我。 ;-)
  • @RobG 大声笑:) 感谢您的警告)无论如何,如果 OP 对替代方法感兴趣,这将意味着我没有花时间打字,否则我将获得额外的 Peer Pressure 徽章)跨度>
猜你喜欢
  • 2016-02-11
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
  • 2020-05-17
  • 2017-10-01
  • 2021-11-06
  • 2019-06-28
相关资源
最近更新 更多