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

问题描述 投票:0回答:1

我有以下问题:

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

* 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"
];

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

我的想法是以某种方式使用递归函数。之前,我使用换行符分隔符将文本拆分为数组。然而,不知何故,我坚持认识到这个功能。

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

javascript algorithm list recursion unordered
1个回答
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);
© www.soinside.com 2019 - 2024. All rights reserved.