Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вообще ничего не понял в этом коде... (https://javascript.ru/forum/misc/79917-voobshhe-nichego-ne-ponyal-v-ehtom-kode.html)

Malleys 13.04.2020 04:46

Цитата:

Сообщение от рони
а можно без использования знака +(везде) а 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]

рони 13.04.2020 08:05

Malleys,
:write:

Nexus 13.04.2020 11:48

Цитата:

Сообщение от Malleys
Если метод называется sum, то он наверное должен сам по себе уметь суммировать.

Со слов автора, он хотел написать только алиас метода reduce.
Почему для алиаса он использовал название "sum" - непонятно.


Часовой пояс GMT +3, время: 18:16.