#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)
);