Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #31 (permalink)  
Старый 13.04.2020, 04:46
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

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

Последний раз редактировалось Malleys, 13.04.2020 в 05:20. Причина: Добавил ЕЩЁ
Ответить с цитированием
  #32 (permalink)  
Старый 13.04.2020, 08:05
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Malleys,
Ответить с цитированием
  #33 (permalink)  
Старый 13.04.2020, 11:48
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,723

Сообщение от Malleys
Если метод называется sum, то он наверное должен сам по себе уметь суммировать.
Со слов автора, он хотел написать только алиас метода reduce.
Почему для алиаса он использовал название "sum" - непонятно.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что в этом коде не так? nzbt Javascript под браузер 0 27.02.2019 15:27
Как в этом коде настроить промежуток на 10 сек ??? ilyas-> Элементы интерфейса 5 27.07.2013 04:54
То-ли лыжи не едут, толи... возможно ошибка в коде. AzriMan Общие вопросы Javascript 19 18.05.2009 16:07