Строка кода в вопросе: let large = arr.reduce ((a, v, i) => v> a [1]? [I, v]: a, [-1,0]); В основном меня смущает эта часть a, [-1,0], я не понимаю этот синтаксис. Что делает ...
3 ответа
Вот как это выглядит с большим количеством расширенных сокращений:
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
, где «значение» представляет возвращаемое значение функции - скобки не требуются. В этом примере это возвращаемое значение является тернарным оператором: condition ? return if true : return if false
. По сути, поскольку они используют одну строку для создания одного значения, скобки или фигурные скобки вокруг функции не требуются.
Функция обратного вызова, которую вы передаете Array.reduce()
, может принимать три аргумента, (accumulator, currentValue, index)
.
Ключевым моментом здесь является начальное значение, которым является [index, value]
, которое отслеживает оба значения до завершения итерации, и в этом случае возвращается только окончательное значение.
Массив, который идет после запятой, является вторым аргументом для .reduce()
. Код там эквивалентен
let largest = arr.reduce(
(a,v,i) => {
return v > a[1] ? [i,v] : a;
},
[-1,0] // second argument
);
На самой итерации аккумулятор представляет собой массив, состоящий из двух значений. Значение, возвращаемое обратным вызовом, становится новым аккумулятором в следующей итерации. Значение, возвращаемое на последней итерации, становится результатом всего выражения .reduce()
- largest
.
Итак, что return v > a[1] ? [i,v] : a;
делает внутри обратного вызова .reduce()
, так это то, что он проходит через массив и находит элемент с наибольшим значением v
- как только [i, v]
этого элемента становится аккумулятором, аккумулятор останется в этом массиве до завершения итерации.
Это легче понять, если формализовать и расширить:
let reducer = (a,v,i) => {
if (v > a[1])
return [i,v];
return a
};
let largest = arr.reduce(reducer, [-1,0]);
Где теперь аргумент функции редуктора довольно ясен.
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.