【发布时间】:2021-08-24 22:11:00
【问题描述】:
我想用 javascript 的函数式风格解决一个问题。
我的字典看起来像这样:
[{
"title": "A",
"isFinal": false,
"children": [{
"title": "AA",
"isFinal": false,
"children": [{
"title": "AAA",
"isFinal": true
},
{
"title": "AAB",
"isFinal": true
}
]
},
{
"title": "AB",
"isFinal": false,
"children": [{
"title": "ABA",
"isFinal": true
},
{
"title": "ABB",
"isFinal": true
}
]
},
{
"title": "AC",
"isFinal": true
}
]
}]
所以这是一棵树,它可以有多达 N (6) 层和任何节点中的更多叶子。最后一个节点将isFinal 字段设置为true。
我想要以下输出
[["A"], ["AA", "AB", "AC"], ["AAA", "AAB", "ABA", "ABB"]]
这是同一数组中同一级别上每个节点的标题。
我认为它与算法递归下降有某种关系,但我无法弄清楚。
到目前为止我可以访问第一级:
function parseData (data) {
const data = new Array();
return data.filter((dataLevelChild) => (!dataLevelChild.isFinal)).map((dataLevelChild, index) => (
dataLevelChild.title
))
}
但我真的不知道如何传递二级元素并将所有内容存储在一个数组中。
另一种方法是使用forEach
function parseData (data) {
const parsedData = new Array();
const parse = (e) => {
parsedData.push({
id: e.title,
});
e.children && e.children.forEach(parse);
}
return data.forEach(parse);
这是不正确的,但至少我可以访问每个元素。它是否具有功能性?在我看来它不像,因为通常你不会像这样在函数式样式中使用 .push
【问题讨论】:
-
你需要一个递归函数来处理任意嵌套。用函数式编程来做这件事会很棘手。
-
@Barmar:你为什么这么说?递归是 FP 中非常常见的技术。例如,我的答案是 FP 解决方案。
-
@ScottSauyet 我知道递归在 FP 中很常见,但将特定递归级别的所有结果放入最终结果中的适当数组元素似乎很棘手。
-
@Barmar:那是唯一让我慢下来的事情,在我通常的广度优先遍历代码之上构建它。我需要考虑一下那些额外的
[-]括号会去哪里。但代码最终相当干净。
标签: javascript recursion functional-programming