2010-06-28 3 views
0

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

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

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

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, а затем преобразовать обратно. Но это звучит немного нехорошо.

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

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

+0

Не используйте для этого jQuery. – SLaks

+0

Насколько велики строки? Могут ли быть прямые ссылки? – SLaks

+0

@SLaks Строка огромная. ~ 10 000 строк. Я делаю много других вещей, так что это довольно медленно. Но это не проблема для этого приложения, скорость не нужна. Я думаю, что материал 'reference-header-3' является прямой ссылкой? (извините, если это не то, что вы имеете в виду.) Всегда верно, что каждый заголовок без подзаголовка имеет прямую ссылку, поэтому лучше всего перебирать прямые ссылки, а не каждую строку? – Mark

ответ

1

Если у вас есть контроль над бэкэнд, вы должны передать эти данные как 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 и вставьте туда соответствующие значения. Решение Slak может быть однопроходным, я думаю (из быстрого чтения, которое я дал). ИЛИ вы можете добавить else-if к вышеуказанному коду (в пределах цикла, где он проверяет hedaer), чтобы проверить, соответствует ли он вашей директиве reference. Если это так, возьмите существующую ссылку и добавьте ее, что у вас есть (это работает только для обратных ссылок). Если у вас есть прямые ссылки, вам нужно будет пройти второй проход.

0

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

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

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

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

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

+0

Спасибо, имеет большой смысл. Я сейчас об этом думаю. Если есть какой-либо код, который вы можете использовать, это тоже здорово. – Mark