【问题标题】:Why js .reduce() behaves differently when array.length==1?为什么当 array.length==1 时 js .reduce() 的行为不同?
【发布时间】:2022-01-02 00:25:43
【问题描述】:

当缩减数组只有 1 个元素时,为什么 JS .reduce() 行为会有所不同?

//friends with 2 elements behave as expected
var friends = [ 
                  {a:1, books: ['Bible', 'Harry']},
                  {a:2, books: ['War', 'Romeo']},
              ] 
var allbooks = friends.reduce((prev, curr) => [prev.books, curr.books]) 
console.log(allbooks)  //as expected: [["Bible","Harry"],["War","Romeo"]]

但是,如果 friends.length==1,它会返回整个对象,而不仅仅是 books 属性:

var friends = [ {a:1, books: ['Bible', 'Harry']} ]
var allbooks = friends.reduce((prev, curr) => [prev.books, curr.books]) 
console.log(allbooks)  //result:  {"a":1,"books":["Bible","Harry"]}

【问题讨论】:

  • 你的减速器不工作。对于数组中的第三本书,prev.books 将是未定义的(因为 prev 现在是一个 array)。您应该阅读 reduce 的实际作用:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 如果[["Bible","Harry"],["War","Romeo"]]是预期结果,就使用:friends.map(o => o.books)

标签: javascript reduce


【解决方案1】:

您缺少 reduce 的第二个参数,该参数使用起始值作为操作的种子。

reduce 的行为在有和没有第二个参数的情况下都会发生变化。如果没有第二个参数,它将第一个元素视为种子。

initialValue 可选
第一次调用回调时将 previousValue 初始化为的值。如果指定了 initialValue,这也会导致 currentValue 被初始化为数组中的第一个值。如果不指定initialValue,previousValue被初始化为数组的第一个值,currentValue被初始化为数组的第二个值。

reduce Docs

【讨论】:

    猜你喜欢
    • 2021-10-25
    • 2020-08-03
    • 2015-03-28
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 2016-05-03
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多