代码之家  ›  专栏  ›  技术社区  ›  Nitish Narang

使用Reduce将数字数组分成3块

  •  1
  • Nitish Narang  · 技术社区  · 7 年前

    [1,2,3,4,5,6,7,8].reduce((a, d, i, c) => [...a, c.splice(0, 3)], [])
    

    结果-[[1,2,3],[4,5,6]]

    预期结果-[[1,2,3],[4,5,6],[7,8]]

    请不要改变方法,因为我想知道为什么这次没有按预期工作。

    2 回复  |  直到 7 年前
        1
  •  3
  •   T.J. Crowder    7 年前

    我想知道为什么这个没有按预期工作。

    reduce 因为在每次回调之前,它都会检查要访问的索引是否仍然小于数组长度,所以会提前用完元素。在第二次回调之后,原始数组的长度为 2 ,索引为 2个 ,所以 减少 停止,从不产生第三块。

    [1,2,3,4,5,6,7,8].reduce((a, d, i, c) => {
      console.log("i", i, "c", JSON.stringify(c));
      return [...a, c.splice(0, 3)];
    }, []);
    .as-console-wrapper {
        max-height: 100% !important;
     }

    正如你所看到的,在第一次calback中,一切都是好的:

    i 0 c [1,2,3,4,5,6,7,8]
    

    在第二次回调中也可以,但是注意 c 现在更短了:

    i 1 c [4,5,6,7,8]
    

    splice 已经在第二次回调中完成了工作, [7, 8] 所以它的长度只有2。 减少 停在那里,因为 i 是现在 2个 ,只有当 i < length 是真的。 2 < 2

    你不能这么做 . 相反,请参见 canonical "chunk" array question's answers . 你 可以 reduceRight Nenad Vracar points out . (希望他/她能把这作为一个答案。)

        2
  •  1
  •   VLAZ Sohail Arif    7 年前

    发生这种情况是因为在迭代时要对数组进行变异。特别是,问题是当 reduce 到达第三个元素时,只有两个元素。

    [1, 2, 3, 4, 5, 6, 7, 8].reduce((a, d, i, c) => {
      console.log("current result", a)
      console.log("current element", d)
      console.log("index", i)
      console.log("array", c)
      return [...a, c.splice(0, 3)]
    }, [])

    所以,当你进入第三次迭代时 i 应该是 2 c )是 [7, 8]