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

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

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). Ты извини, но мне кажется это не правильным. Только путает. Я изменил название и всё осталось таким же, рабочим)

Я немного углублюсь в код… Будет время - напиши. Мне интересно, что здесь происходит…
1)


2)

Никакой разницы. Идиоматически писать анонимные функции если они маленькие и ссылу на них не нужно использовать дальше.

Да. sum было бы лучше.

Про этот метод и общий подход я описал в пером комментарии.

  1. Дебаггер это штука которая не всегда 1 в 1 работает как выполнение кода. Если ты поставишь console.log внутри функции то увидешь что она вызывается для каждого элемента массива. Твое представление о работе функции корректное.

  2. Смотри мой первый комментарий:

  • magic() == 0; // true фишка сравнения (обрати внимание что оно нестрогое) в том что если с разных сторон неравенства стоят несовместимые типы, то интерпретатор пытается привести типы. Один из подкапотных шагов который он делает - вызов метода valueOf у несоответствующего типа. Мы уже определили что результат magic - должна быть функция. Если ей сделать метод valueOf который возвращает число, то он будет вызываться при нестрогом сравнении и поведение сравнении будет таким как ожидается.

Привет)

const m = magic(2,2);
m(2) == 6; // true
m(2) == 6; // false

тогда

const newmagic = (...args) => {
  const f = (sum, ...args) => {
    sum = args.reduce((ac, n) => ac + n, sum);
    const newf = f.bind(null, sum);
    newf.valueOf = () => sum;
    return newf;
  }
  return f(0, ...args);
}

const newm = newmagic(2,2);
newm(2) == 6; //true
newm(2) == 6; //true
1 лайк