通过递归函数问题无序列表“合并”

时间:2019-04-29 14:17:48

标签: javascript algorithm list recursion unordered

我有以下问题:

我有这个字符串,看起来像这样:

* item1
* item2
** item21
** item22
* item3
** item31
** item32
***item321
* item4

这类似于无序嵌套列表(这意味着item21和item22是项目2的子类别,依此类推)。

我想用javascript / node.js代码编写,输出结果就是这样

array = [
  "item1",
  "item2 item21",
  "item2 item22",
  "item3 item31",
  "item3 item32 item321",
  "item4"
];

如您在输出中看到的,显示文本的项目按类别和子类别合并。

我的想法是使用某种递归函数。之前,我使用换行符将文本拆分为数组。但是,无论如何,我坚持实现该功能。

对于任何想法或伪代码/代码,我都会感到高兴和感激。 再次感谢你们。

1 个答案:

答案 0 :(得分:0)

以下是帮助您入门的摘要。

请注意,您的示例输入内容存在细微的不一致,因此我冒昧地认为这是一个错字。具体来说,您输入的倒数第二行***item321*之后缺少空格。我以为这是一个错字,但如果不是,请随时从正则表达式中删除空格。

let input = `
* item1
* item2
** item21
** item22
* item3
** item31
** item32
*** item321
* item4
`;

let lines = input
    .split('\n')
    .filter(a => a)
    .map(line => {
      let [_, stars, value] = line.match(/^(\**) (.*)/);
      return {depth: stars.length, value};
    });

let hierarchy = [];
let output = [];
lines.forEach((line) => {
  if (hierarchy.length && line.depth <= hierarchy[hierarchy.length - 1].depth)
    output.push(hierarchy.map(a => a.value).join(' '));

  while (hierarchy.length && line.depth <= hierarchy[hierarchy.length - 1].depth)
    hierarchy.pop();

  hierarchy.push(line);
});
output.push(hierarchy.map(a => a.value).join(' '));

console.log(output);