уменьшить [{x: 2}, {x: 22}, {x: 42}] на JavaScript - PullRequest
1 голос
/ 21 февраля 2020

Любые предложения о том, как понять, почему первое сокращение вызова приводит к NaN, а второе - 22?

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

let maxCallback = ( acc, cur ) => Math.max( acc.x, cur.x );


// reduce without initialValue
[ { x: 2 }, { x: 22 }, { x: 42 } ].reduce( maxCallback ); // NaN
[ { x: 2 }, { x: 22 }            ].reduce( maxCallback ); // 22

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

Требуется initialValue, чтобы применить начальный возврат к некоторому значению.

  • acc - это Целое число (которое начинается с 0)
  • cur - это Объект , из которого мы уменьшить его x значение свойства
  • Поэтому используйте второй initialValue параметр .reduce( maxCallback, 0 )
  • Назначить как acc = Math.max( acc, cur.x )
  • Неявно вернуть , acc)

let maxCallback = ( acc, cur ) => (acc = Math.max( acc, cur.x ), acc);

// reduce with initialValue
const a = [ { x: 2 }, { x: 22 }, { x: 42 } ].reduce( maxCallback, Number.MIN_SAFE_INTEGER ); // 42
const b = [ { x: 2 }, { x: 22 }            ].reduce( maxCallback, Number.MIN_SAFE_INTEGER ); // 22

console.log(a, b)

initialValue необязательно и полезно - но если вы не уменьшите два разных типа как объект в номер - но номер в номер как:

let maxCallback = ( acc, cur ) => (acc = Math.max( acc, cur ), acc);

// reduce without initialValue
const a = [ 2, 22, 42 ].reduce( maxCallback ); // 42
const b = [ 2, 22     ].reduce( maxCallback ); // 22

console.log(a, b)
1 голос
/ 21 февраля 2020

Функция Reduce должна возвращать объект того же формата, что и в массиве:

let maxCallback = ( acc, cur ) => ({ x: Math.max( acc.x, cur.x )});
...