Возможно ли задать initialValue метода reduce в стрелочных функциях?

140
02 декабря 2021, 03:10

нужно получить сумму всех свойств обьектов amount находящийся в массиве orders.

Я сделал это с помощью анонимный функции но никак не смог релизовать с помощью стрелочных функций.

const orders = [ 
  {amount:250}, 
  {amount:80}, 
  {amount:3}, 
  {amount:40} 
]; 
 
 
let result = orders.reduce(function(current,order){ 
  return current + order.amount; 
}, 0) 
alert(result);

ВОПРОС:Как задать initialValue в стрелочных функциях?

Мои попытки

let attempt = orders.reduce((index,current) => {index + current.amount}, 0)
Answer 1

initialValue - это обычный параметр.

Здесь больше важна особенность того, как разбирается стрелочная функция.

при указании (index,current) => index + current.amount данная функция эквивалентна следующей

function (index,current)  { return index + current.amount}

В то же время при явном указании блока: (index,current) => {index + current.amount}

function (index,current)  { index + current.amount }

Отсюда видно, что функция ничего не возвращает.

Для решения нужно либо добавить return: (index,current) => { return index + current.amount}

Либо обернуть тело функции в круглые скобки, что позволит парсеру отделить тело функции от следующего параметра:

(index,current) => (index + current.amount)

примеры:

const orders = [{ 
    amount: 250 
  }, 
  { 
    amount: 80 
  }, 
  { 
    amount: 3 
  }, 
  { 
    amount: 40 
  } 
]; 
 
 
let result = orders.reduce(function(current, order) { 
  return current + order.amount; 
}, 0) 
console.log(result); 
 
result = orders.reduce((current, order) => { 
  return current + order.amount; 
}, 0) 
console.log(result); 
 
result = orders.reduce((current, order) => (current + order.amount), 0) 
console.log(result);

Answer 2

Если вы в стрелочной функции используете блок {...} то вы должны вернуть из него значение оператором return. Если же в стрелочной функции ровно один оператор и он же является результатом функции, то ни блока {...}, ни оператора return не нужно

const orders = [ 
  {amount:250}, 
  {amount:80}, 
  {amount:3}, 
  {amount:40} 
]; 
 
let result = orders.reduce((current, order) => current + order.amount, 0); 
console.log(result); 
 
result = orders.reduce((current, order) => { 
  return current + order.amount; 
}, 0); 
console.log(result);

READ ALSO
Как изменить вид кнопки привязкой к boolean

Как изменить вид кнопки привязкой к boolean

я бы хотел бы попросить помощьЯ нажимаю на Action и Completed меняеться на Done

233
Подставить имя массива из аргумента функции

Подставить имя массива из аргумента функции

Возможно ли подставить имя массива из переменной

98
Чему равно свойство length (в строках a, b) массива r.?

Чему равно свойство length (в строках a, b) массива r.?

Вопрос из задачника, но в коде нет b?

94
Не получается передать переменную в тело запроса

Не получается передать переменную в тело запроса

Использую postman для rest тестирования

157