微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

这段 JS 代码查找数组中最大值的索引,但它是如何工作的? 发生了什么:

如何解决这段 JS 代码查找数组中最大值的索引,但它是如何工作的? 发生了什么:

有问题的代码行:

let largest = arr.reduce((a,v,i) => v > a[1] ? [i,v] : a,[-1,0]);

我主要对这部分 a,0] 感到困惑,我不明白这个语法。逗号前的 a 是做什么的?

解决方法

这是扩展了很多速记后的样子:

const reducer = (accumulator,currentValue,index) => {
  if (currentValue > accumulator[1]) {
    return([index,currentValue])
  } else {
    return(accumulator)
  }
}

let largest = accumulator.reduce(reducer,[-1,0])

发生了什么:

Array.prototype.reduce() 有两个参数,回调函数和初始值。这就是 [-1,0] 的来源,即第一次迭代时将作为“累加器”传递给回调函数的“初始值”。

javascript 中函数的最短简写是 () => value,其中“value”代表函数的返回值——不需要括号。在这个例子中,返回值是一个三元语句:condition ? return if true : return if false。本质上,因为它们使用单​​行来生成单个值,所以函数周围不需要括号或大括号(以 a 结尾)。

您传递给 Array.reduce() 的回调函数可以采用三个参数 (accumulator,index)

这里的关键在于初始值,即 [index,value],它会跟踪两者直到迭代完成,在这种情况下,只返回最终值。

,

逗号后面的数组是 .reduce()第二个参数。那里的代码相当于

let largest = arr.reduce(
  (a,v,i) => {
    return v > a[1] ? [i,v] : a;
  },0] // second argument
);

在每次迭代中,累加器是一个由 2 个值组成的数组。从回调返回的值在下一次迭代中成为新的累加器。最后一次迭代返回的值成为整个 .reduce() 表达式 - largest 的结果。

那么 return v > a[1] ? [i,v] : a;.reduce() 回调中所做的是遍历数组并找到具有最高 v 的项目 - 一旦 [i,v] 变为累加器,累加器将保持该数组直到迭代完成。

,

如果形式化和扩展,这会更容易理解:

let reducer = (a,i) => {
  if (v > a[1])
    return [i,v];

  return a
};

let largest = arr.reduce(reducer,0]);

reducer 函数参数现在哪里很清楚了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。