Сообщение от рони
|
а можно без использования знака +(везде) а fn применить только в строке 6
|
Если метод называется sum, то он
наверное должен сам по себе уметь суммировать...
А то у
Nexus (№30),
voraa (№28),
SuperZen (№26),
рони (№25) (см. примеры выше) получается, что если fn заменить на умножение, то метод sum так «просуммирует», что получится умножение... (уже не говоря о сложности использования, которое предполагает дополнительные вызовы fn)
const a = [1, 2, 3];
const b = [4, 5, 6];
Array.prototype.sum = (sum => function(b = []) {
return b.reduce(sum, this.reduce(sum, 0), 0);
})((a, b) => a + b);
console.log(a.sum(b)) // 21
ЕЩЁ Можно выделить в отдельную функцию...
const reducer = (fn, getInitialValue) => function(b = []) {
return b.reduce(fn, this.reduce(fn, getInitialValue()), getInitialValue());
};
Array.prototype.sum = reducer((a, b) => a + b, () => 0);
Array.prototype.mul = reducer((a, b) => a * b, () => 1);
Array.prototype.collectOdds = reducer((a, b) => b % 2 === 0 ? a : a.concat(b), () => []);
const a = [1, 2, 3];
const b = [4, 5, 6];
console.log(a.sum(b)) // 21
console.log(a.mul(b)) // 720
console.log(a.collectOdds(b)) // [1, 3, 5]
ЕЩЁ Можно reducer получить при помощи редукции, что позволит передавать в методы более одного массива...
const reducer = (fn, getInitialValue) => function(...as) {
return [this, ...as].reduce((m, v) => v.reduce(fn, m), getInitialValue());
};
Array.prototype.sum = reducer((a, b) => a + b, () => 0);
Array.prototype.mul = reducer((a, b) => a * b, () => 1);
Array.prototype.collectOdds = reducer((a, b) => b % 2 === 0 ? a : a.concat(b), () => []);
const a = [1, 2, 3];
const b = [4, 5, 6];
console.log([10, 20].sum(a, b)) // 51
console.log(a.mul(b)) // 720
console.log([-1].collectOdds(a, b)) // [-1, 1, 3, 5]