Введение в ООП

а при новом вызове magic, ты не потеряешь значение в res?

Стратегически. Нет.

Эта механика как раз с “глобальной” переменной.

При такой последовательности вызова magic будет содержать предыдущие состояния которые повлияют на результат во второй строчке.

magic() == 0; // true
magic(5, 2, -8) == -1; // true

Записывать в prototype методы неверно идеологически.


Тактически тоже много проблем.

magic.getResult - это должен быть вызов.
this.result = result; - this не причем так как ты не работаешь с инстансами классов
magic.prototype.getResult запись в prototype не даст возможность вызывать код так: magic.getResult.
magic.prototype.setResult - лишний код, метод не нужен ты можешь сразу записать результат куда нужно.

Нет, я про reduce со вторым параметром имел ввиду. Правильно ли пошёл в этом смысле… Про prototype я уже понял

const magic = (...arg) => {
   const arr = [...arg];
   
 const result = arr.reduce((total, nextEl) => total + nextEl, boxCounter); // как-то надо сохранять boxCounter
 
 return ...; 
}

Стартовать reduce с предыдущего значения? Да.

Дмитрий, нужна небольшая помощь. Решил написать функцию magic c рекурсией, используя внутреннюю функцию для вызова. Но у меня падает с ошибкой… Не могу понять, в чём она и как исправить?

const magic = function(...args){
  const sum = 0;
  const v = 0;
  const result = 0;
  const arr = [...args];

 function innerMagic(mySum, myV){
    const sumOf = mySum + myV;
    return sumOf;
  }
  let finish = arr.reduce(innerMagic(sum, v), result);
  return finish;
}

console.log(magic(5, 2, -8) == -1); // true

Вижу вот эту ошибку

TypeError: innerMagic(...) is not a function

Ее суть в том что результат вызова innerMagic(...) это не функция, а этот результат передается аргументом там где ожидается функция.

У меня ошибка следующая:

TypeError: 0 is not a function
    at Array.reduce
    at magic

не загружается картинка

Тебе не нужно разбираться с нулем. Потому что проблема в другом месте. Проблема описана в моем предыдущем комментарии Введение в ООП

Я пока не решаю полностью задачу, а делаю её первый шаг. Я пытаюсь сложить все параметры, что есть в функции:
Немного переписал:

const magic = function(...args){
  const sum = 0;
  const v = 0;
  const result = 0;
  const arr = [...args];
  let n = 0;

 function innerMagic(innerArr, mySum, myV){
   n +=  1;
   if(n > 2){ // поставил условие, чтобы прервать работу функции
     return result;
   }
if(innerArr != 'underfined'){
  const sumOf = mySum + myV;
}
   
    return innerArr.reduce(innerMagic(sum, v), result);
  }
  
  innerMagic(arr, sum,  v);
}

console.log(magic(5, 2, -8) == -1); // true

только понять не могу, почему выходит ошибка:

TypeError: innerArr.reduce is not a function
    at innerMagic:28:21
    at innerMagic:28:28
    at magic:31:3

первый аргумент reduce должна быть функция. А у тебя - результат вызова фнукции.

Вот так передается функция (но не думаю что будет работать так как ты хочешь)

innerArr.reduce(innerMagic, result);

нет, в документации всё так же, как и у меня. Так делать можно

var total = [0, 1, 2, 3].reduce(function(a, b) {
  return a + b;
});

И

две разницы.

Выполни код. Тут 3 примера вызова reduce. В последнем console.log при вызове reduce аргументом передается результат вызова функции - 1 в 1 как у тебя. В первом - ака в документации что ты показал.

const arr = [1,2,3,4,5]
function sum(res, v) {
	return res + v
}
console.log(arr.reduce(function (res, v) { return res + v }, 0))
console.log(arr.reduce(sum, 0))
console.log(arr.reduce(sum(0,0), 0))

Написал так, не помогло:

return innerArr.reduce(innerMagic, result);

Я и не говорю что должно помочь. Я говорю о причине ошибки. Сейчас должна показываться другая ошибка.

нет, она абсолютно такая же!

TypeError: innerArr.reduce is not a function
    at innerMagic:38:21
    at Array.reduce
    at innerMagic:38:21
    at magic:41:3

Понял. Я отвечал все еще на TypeError: 0 is not a function.

TypeError: innerArr.reduce is not a function - эта про то что у innerArr нет метода reduce. И тут нужно использоват механический подход к поиску проблемы как я описывал раньше. Какие предположения ты будешь проверять в рамках этого подхода?

13.03

Код:

const magic = function(...args){
	const sum = 0;
	const v = 0;
	let result = 0;
	const arr = [...args];
	let n = 0;
  
   function innerMagic(mySum, myV){
	 n +=  1;
  
	 if(n >= arr.length){
	   return result;
	 }
	 
		result = mySum + myV;
		return arr.reduce(innerMagic, result);
	  
	}
	
	innerMagic(sum, v);
  }
  
  console.log(magic(5, 2, -8) == -1); // true

Я не знаю как ответить на этот вопрос. Давай я покажу свое решение а ты найдешь в нем вдохновение.

function magic(...args) {
	let res = 0
	function calc(...args) {
		res = args.reduce((res, val) => res + val, res)
		return calc
	}
	calc.valueOf = function () {
		return res
	}
	return calc(...args)
}

console.log(magic(1,2,3)(1,2,3) == 12)
console.log(magic(1,2,3) == 6)
1 лайк

Благодарю! Видел уже подобное решение, надеялся написать своё. Сразу, что бросается в глаза, так это то, что:

  1. ты пишешь функцию внутри reduce, а не выносишь её наружу
  2. у тебя никто не ругается, что res и val не определены. не понятно, почему у меня ругается(вот поэтому у меня столько переменных в начале…)
  3. ты используешь какой-то метод valueOf. Я пытался понять, что это, искал информацию, но пока не нашёл ничего достойного, нормально описывающего этот метод(без него, я заметил, ничего не работает) )

Смущает меня и то, что у тебя первый параметр функции совпадает со вторым параметром метода reduce(я про res). Ты извини, но мне кажется это не правильным. Только путает. Я изменил название и всё осталось таким же, рабочим)