gpt4 book ai didi

javascript - 我需要一些帮助来理解这种方法的组合(reduce、concat 和 map)

转载 作者:行者123 更新时间:2023-12-02 22:29:27 25 4
gpt4 key购买 nike

我正在学习 ES6,我正在为这行代码而苦苦挣扎。我知道我在这里失去了一些东西,但我就是不明白到底发生了什么。

代码:

const powerset = arr => 
arr.reduce((a, v) =>
a.concat(a.map(r =>
[v].concat(r))), [[]]);

console.log(powerset([1, 2, 3]));

输出:

[[], [1], [2], [2, 1], [3], [3, 1], [3, 2], [3, 2, 1]]

我在这里看到什么?

第一个 concat 将在“主数组”内连接每个 map 的返回值,而这一个将连接 r 的值值为 v,并且我相信 r 等于 a

基于此,我的理解是(我知道我错了,但我不知道为什么)它应该像这样工作:

在第一个“级别”中,a 是一个空数组,并且 v 等于 1,因此第一个值应该是 [1] 而不是 [],因为 rv 连接;在第二个“级别”中,a 等于 1,v 等于 2,将返回 [2, 1],而在第三个“级别”中,将返回 [2, 1] level' 的返回结果将为 [3, 2, 1],因为 v 等于 3,a 等于 [2, 1 ]

正如我之前所说,我知道我错了,但我只是看不到我在这里失去了什么。我做了研究,也做了很多实验,但我没有明白。

这段代码到底是如何工作的?

最佳答案

让我们首先稍微修复一下格式:

arr.reduce(
(a, v) => a.concat(a.map(r => [v].concat(r))),
[[]]
)

所以,reduce需要[[]]作为起始值,回调返回与其他内容连接的列表。到目前为止一切顺利,返回值是 [[], ...] 是有道理的。然后,它是附加了附加值的起始值。

三个值被传递到 powerset ,将有此 reduce 的三个迭代流程。

现在,每轮都会将什么连接到该列表?

a.map(r => [v].concat(r))

a是它开头并将返回的列表,varr 中的当前值,传递到 powerset 的列表首先。 r当前的每个值都是a .

因此,在第一次迭代中,a[[]] ,所以r将是[]一次,和v1 :

  [[]].map(_ => [1].concat([]))
→ [[]].map(_ => [1]) // [1].concat([]) is [1]
→ [[1]]

所以这是第一个map操作返回[[1]] :

  (a, _) => a.concat([[1]])
→ (_, _) => [[], [1]]

所以,您确实在这里看到了输出的开头。在下一次迭代中,a[[], [1]]v2 .

  a        .map(r => [v].concat(r))
→ [[], [1]].map(r => [2].concat(r)) // two mappings here:
→ [] → [2].concat([]) // [2]
→ [1] → [2].concat([1]) // [2, 1]
→ [[2], [2, 1]]

所以:

  (a, _) => a.concat([[2], [2, 1]])
→ (_, _) => [[], [1], [2], [2, 1]]

你可以自己算出第三次迭代。

关于javascript - 我需要一些帮助来理解这种方法的组合(reduce、concat 和 map),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58957597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com