вызов функции несколько раз с сохранением результата - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть вопрос.

Мне нужно разработать функцию add(), которая бы суммировала данные аргументы. Проблема в том, что его можно вызывать несколькими способами следующим образом:

add(1, 2, 3, 4, 5) // outputs 15
add(1, 2)(3)(4, 5) // outputs 15
add(1, 2, 3)(4, 5) // outputs 15

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

return arg.reduce((prev, current) => prev + current)

Количество аргументов всегда 5. Не больше, не меньше.

Однако я не уверен, что делать с последовательными вызовами здесь. У кого-нибудь есть идеи?

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Это своего рода общий подход, в котором вы можете передавать динамические аргументы в функцию «add» ниже, и об этом позаботится функция «parseAdd».

В общем, эта проблема подпадает под категорию функции «карри», которую стоит прочитать. Кроме того, понимание bind и function.toString () поможет вам лучше понять этот подход.

function addition(...args) {
  return args.reduce((conc, v) => conc += v ,0)
}
                
            
function parseAdd(fn) {
  var newFn = fn.bind(null);

  function cal(...args) {
    newFn = newFn.bind(null, ...args);
    return cal;
  }

  cal.toString = () => newFn();

  return (...arg) => { newFn = fn.bind(null); return cal(...arg) }
}
                
           
var add = parseAdd(addition);

console.log(add(1,2,3,4))
console.log(add(1,2,3)(4)(5))
console.log(add(1)(2)(3)(4)(5)(6))
0 голосов
/ 03 ноября 2018

Пусть add возвращает функцию, которая имеет постоянный массив в своей области действия, который отслеживает все аргументы, которые были переданы, в совокупности. При каждом вызове push в этот массив - как только в этом массиве будет 5 элементов, вернуть суммированный массив как число, в противном случае вернуть ту же функцию:

function add(...initialArgs) {
  const allArgs = [];
  function inner(...args) {
    allArgs.push(...args);
    return allArgs.length === 5
     ? allArgs.reduce((a, b) => a + b)
     : inner;
  }
  return inner(...initialArgs)
}

console.log(add(1, 2, 3, 4, 5)) // outputs 15
console.log(add(1, 2)(3)(4, 5)) // outputs 15
console.log(add(1, 2, 3)(4, 5)) // outputs 15

Конечно, это зависит от знания заранее, что общее количество аргументов всегда будет ровно 5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...