Как написать чейн функцию sum(10, 20)(30, 40) что бы получить в return результат последнего чейна?

Доброй ночи Как-то дали задание написать чейн функцию с подсчётом аргументов и возвращать их результат, но при этом использовать чейн для последующих операций. sum(10, 20)(30, 40) Как мне написать чейн такого типа?


Ответы (2 шт):

Автор решения: nazarpunk

const sum = (a, b) => (c, d) => a + b + c + d;
console.log(sum(10, 20)(30, 40));

Задача с произвольным количеством скобок разбирается здесь.

function sum() {
  let currentSum = [...arguments].reduce((a, b) => a + b, 0);

  function f() {
    currentSum += [...arguments].reduce((a, b) => a + b, 0);
    return f;
  }

  f.toString = function() {
    return currentSum;
  };

  return f;
}

console.log( sum(1,2)(3,4)(5,6,7) );

→ Ссылка
Автор решения: yar85

Например, можно вот так написать:

const sum = Object.assign(function (...args) {
  sum.lastVal = [...args].reduce((rslt, val) => rslt += +val, sum.lastVal);
  return sum;
}, {
  [Symbol.toPrimitive]: function (hint) {
    return !isFinite(this.lastVal) ? 0 : this.lastVal;
  },
  lastVal: 0,
});

console.log(
  +sum(10, 20)(30, 40),    // 100: 0+(10+20)=30 ► 30+(30+40)=100
  +sum(1, 8, 1)(30)(10)    // 150: 100+(1+8+1)=110 ► 110+(30)=140 ► 140+(10)=150
);

Унарный плюс - для приведения типа к числовому: оно и триггерит собственный метод объекта функции, заданный символом (тут используется стандартный символ метода приведения к примитивному типу). Если не использовать типкаст к number, то будет возвращен объект функции... тут в сниппетах это показать невозможно из-за принудительной сериализации результата, но такое поведение можно проверить в консоли браузера (хотя и так очевидно что без типкаста возвращается именно объект функции, ведь иначе чейнинг вызовов в примере просто не работал бы).


Еще можно использовать переопределение метода toString экземпляра, или собственный прототип, или объект Proxy, и так далее. Учитывая все возможные вариации, решений задачи может быть множество.

→ Ссылка