а при новом вызове 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(...)
это не функция, а этот результат передается аргументом там где ожидается функция.
не загружается картинка
Тебе не нужно разбираться с нулем. Потому что проблема в другом месте. Проблема описана в моем предыдущем комментарии Введение в ООП
Я пока не решаю полностью задачу, а делаю её первый шаг. Я пытаюсь сложить все параметры, что есть в функции:
Немного переписал:
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
. И тут нужно использоват механический подход к поиску проблемы как я описывал раньше. Какие предположения ты будешь проверять в рамках этого подхода?
Код:
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)
Благодарю! Видел уже подобное решение, надеялся написать своё. Сразу, что бросается в глаза, так это то, что:
- ты пишешь функцию внутри reduce, а не выносишь её наружу
- у тебя никто не ругается, что res и val не определены. не понятно, почему у меня ругается(вот поэтому у меня столько переменных в начале…)
- ты используешь какой-то метод valueOf. Я пытался понять, что это, искал информацию, но пока не нашёл ничего достойного, нормально описывающего этот метод(без него, я заметил, ничего не работает) )
Смущает меня и то, что у тебя первый параметр функции совпадает со вторым параметром метода reduce(я про res). Ты извини, но мне кажется это не правильным. Только путает. Я изменил название и всё осталось таким же, рабочим)