array.push 不是一个函数 - 当使用 reduce [重复]

Posted

技术标签:

【中文标题】array.push 不是一个函数 - 当使用 reduce [重复]【英文标题】:array.push is not a function - when working with reduce [duplicate] 【发布时间】:2017-12-06 03:06:25 【问题描述】:

有人可以帮我理解这里发生了什么吗?

let firstArray = [];
firstArray.push(1);
firstArray.push(1);
firstArray.push(1);
console.log("firstArray", firstArray); // result [ 1, 1, 1 ] - as expected.



let secondArray = [1, 2, 3].reduce((acc, item) => 

    console.log("acc", acc);
    console.log("typeof acc", typeof acc);

    // on first passing, the accumulator (acc) is Array[] == object.
    // on the second passing the acc == number.

    // but why?
    /// i expect to get [1,1,1] as my secondArray.
    return acc.push(1);

, []);

console.log("secondArray", secondArray); 

程序因“acc.push 不是函数”而崩溃

检查第一个记录的accumulator 表明我们有 push 方法 - 这是一个真正的功能:

【问题讨论】:

return acc.concat(item); push 是否返回推送的元素?尝试推入单独的行,然后返回 acc。 【参考方案1】:

Array#push的返回值是推送后数组的新长度。这意味着在第二次迭代中acc 是一个数字,它没有push 方法。

解决方法很简单——将 push 和 return 语句分开:

const secondArray = [1, 2, 3].reduce((acc, item) => 
    acc.push(1);

    return acc;
, []);

console.log(secondArray);

【讨论】:

为什么acc的第二次迭代变成了数字? @Ori Drori - 刚刚看到你的评论 - 不要让初学者感到困惑:没有 according.push() - 在上面的问题代码中 accaccumulator 的快捷方式 - 这来自函数式语言其中folding / reducing 是人们每天执行的基本操作之一,accsummed up / accumulated 的通用名称。用于树、字典、状态机、数组、列表、任务,任何依赖。相当广泛的传播模式。鉴于这是关于减少数组,了解 acc 依赖代表什么非常重要。就是这样:)

以上是关于array.push 不是一个函数 - 当使用 reduce [重复]的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 开发人员不使用 Array.push() 是不是有原因?

Array .push 在 Promise 函数中不起作用

es5 - array - push

ReactJS Array.push 函数在 setState 中不起作用

Javascript - 为啥从函数返回 array.push(x) 不会将元素 x 推送到数组中?

数组函数