Ошибка типа, связанная с аккумулятором метода уменьшения

#javascript #typeerror

#javascript #ошибка типа

Вопрос:

Я пытаюсь выяснить, почему следующий код

 const test = function(arr){
    const reducer = (acc,el) => {
        if(el>0){
            return acc.push(el**2);
        }
    }
    return arr.reduce(reducer,[]);
}
console.log(test([2,3,4-5-6-1]));
  

выдает ошибку типа, в которой говорится, что acc.push is not a function . Кажется, мне нужно каким-то образом объявить, что параметр acc должен быть массивом, но я не знаю как.

Возможно, это вопрос новичка, но я не знаю, что делать. Может кто-нибудь просветить меня об этой ошибке?

Ответ №1:

Аккумулятор должен быть возвращен на каждой итерации. Array.prototype.push() возвращает новую длину массива, чтобы на следующей итерации он выдавал ошибку

 const test = function (arr) {
  const reducer = (acc, el) => {
    if (el > 0) {
      acc.push(el ** 2)
    }
    return acc
  }

  return arr.reduce(reducer, [])
}
console.log(test([2, 3, 4, 5, 6, 1]))  

Ответ №2:

Array.push возвращает новую длину массива. Вам нужно вернуть массив из редуктора.

 const test = function(arr){
    const reducer = (acc,el) => {
        if(el>0){
            acc.push(el**2);
        }
        return acc;

    }
    return arr.reduce(reducer,[]);
}
console.log(test([2,3,4-5-6-1]));  

Однако есть более простой способ: фильтровать и сопоставлять

 console.log(
    [2, 3, -1]
        .filter(x => x > 0)
        .map(x => x ** 2)
);