如何解决这段 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 举报,一经查实,本站将立刻删除。