Строка кода в вопросе: let large = arr.reduce ((a, v, i) => v> a [1]? [I, v]: a, [-1,0]); В основном меня смущает эта часть a, [-1,0], я не понимаю этот синтаксис. Что делает ...

5
alalalal 6 Апр 2021 в 03:07

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], которое отслеживает оба значения до завершения итерации, и в этом случае возвращается только окончательное значение.

1
Ryan 6 Апр 2021 в 00:27

Массив, который идет после запятой, является вторым аргументом для .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] этого элемента становится аккумулятором, аккумулятор останется в этом массиве до завершения итерации.

2
Sean 6 Апр 2021 в 00:14

Это легче понять, если формализовать и расширить:

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

  return a
};

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

Где теперь аргумент функции редуктора довольно ясен.

1
tadman 6 Апр 2021 в 00:11