манипулирование строкой JavaScript - PullRequest
0 голосов
/ 29 июня 2010

У меня есть длинная строка с Заголовками и Подзаголовками .Предполагается, что каждый заголовок имеет подзаголовок, а предварительная обработка строки - нет.Мне нужно манипулировать им таким образом, чтобы каждый заголовок имел подзаголовок.

Каждый заголовок, который не имеет строки, имеет опорную точку под другим заголовком.Заголовок, в котором отсутствует подзаголовок, должен извлечь подзаголовок из непосредственного родительского / исходящего заголовка ссылки.

Вот как это выглядит:

Header 1
subheader - somedata A
text
reference-header-3
stuff in the way

Header 2
subheader - somedata B
stuff in the way
stuff in the way

Header 3
stuff in the way
stuff in the way
reference-header-5

Header 4
subheader - somedata C
some text

Header 5
more text

Мне нужно, чтобы он был таким:

Header 1
subheader - somedata A
text
reference-header-3
stuff in the way

Header 2
subheader - somedata B
stuff in the way
stuff in the way

Header 3
subheader - somedata A [this is copied from header 1]
stuff in the way
stuff in the way
reference-header-5

Header 4
subheader - somedata C
some text

Header 5
subheader - somedata A [this is copied from header 3]
more text

Если кто-нибудь знает какие-либо строковые библиотеки, которые могут помочь в этом, это было бы здорово.Я не знаю, как это сделать, я думаю о преобразовании их в элементы DOM, чтобы я мог пересечь их с помощью jQuery, а затем преобразовать обратно.Но это звучит немного странно.

Кто-нибудь знает, как это сделать?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 29 июня 2010

Если у вас есть контроль над бэкэндом, вы должны отправить эти данные в формате JSON. Это было бы лучшим выбором. Это также относительно безболезненно. Вам также не следует использовать для этого jQuery (его использование здесь довольно неактуально), если только вы не использовали AJAX для получения JSON, как я описал.

Или вы можете сделать что-то вроде этого:

var str = "Header 1\none\ntwo\nthree\n\nHeader 2\nsubheader - one\ntwo\nthree\n\nHeader 3\none\ntwo\nthree\n";
var lines = str.split(/\n/);

var headerMap = {};
var currentHeader = "";

for(var i = 0; i < lines.length; i++) {

   var line = lines[i];
   line = line.replace(/^\s+/, "").replace(/\s+$/, ""); //trim whitespace

   if(/^Header [0-9]+$/.test(line) && line != currentHeader) {
      headerMap[line] = new Array();
      currentHeader = line;
   }

   //don't add blank lines
   if(line != "") {
      headerMap[currentHeader][headerMap[currentHeader].length] = line;
   }
}

Теперь у вас есть карта с ключами Header 1 и Header 2 и так далее. Значением для каждого ключа является массив, который содержит различные подзаголовки. Вы можете легко перебрать эти значения и проверить самое первое значение в массиве, чтобы увидеть, имеет ли оно префикс subheader -. Если нет, вы можете добавить его.

Я только что заметил вторую часть. Я думаю, что вы можете сделать после того, как вы сделаете выше, это сделать второй проход, разобрать части reference и вставить туда соответствующие значения. Я думаю, что решение Слака может быть однопроходным (из краткого описания, которое я дал). ИЛИ вы можете добавить else-if к приведенному выше коду (внутри цикла, где он проверяет хедера), чтобы проверить и проверить, соответствует ли оно вашей директиве reference. Если это так, возьмите существующую ссылку и добавьте к ней то, что у вас есть (это работает только для обратных ссылок). Если у вас есть прямые ссылки, вам понадобится второй проход.

0 голосов
/ 29 июня 2010

Вы должны пройтись по строкам в строке и построить ссылки заголовка таблицы соответствия, соответствующие их полям данных, и добавить каждую строку в массив output.

Когда вы встретите заголовок, установитефлаг, указывающий, что вы ожидаете подзаголовок.
Если флаг установлен, а текущая строка не является подзаголовком, найдите ссылку в таблице поиска и добавьте строку подзаголовка в выходной массив перед фактической строкой..

Если последняя строка может быть заголовком, вам нужно будет повторить эту проверку после цикла.

Если после заголовка может появиться ссылочная строка, вам нужно проверить и добавить подзаголовки в секунду, в обратном направлении, перебрать output после заполнения output и заполнения таблицы поиска.Если это так, вы должны вставить подзаголовки, позвонив splice.

Когда вы закончите, позвоните output.join('\n').

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...