«Слияние» неупорядоченного списка с помощью функции рекурсии - PullRequest
0 голосов
/ 29 апреля 2019

У меня следующая проблема:

У меня есть эта строка, которая выглядит так:

* 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 голосов
/ 29 апреля 2019

Вот фрагмент кода, с которого можно начать.

Обратите внимание, что в вашем примере входных данных было небольшое несоответствие, поэтому я позволил себе предположить, что это опечатка.В частности, вторая-последняя строка вашего ввода ***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);
...