我有以下问题:
我有这个字符串,看起来像这样:
* 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"
];
如您在输出中看到的,显示文本的项目按类别和子类别合并。
我的想法是使用某种递归函数。之前,我使用换行符将文本拆分为数组。但是,无论如何,我坚持实现该功能。
对于任何想法或伪代码/代码,我都会感到高兴和感激。 再次感谢你们。
答案 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);