2010-06-28 59 views
0

我有一個長字符串頭文件分頭文件。每個頭應該有一個子頭,但是字符串預處理不。我需要以每個頭都有一個子頭的方式操縱它。javascript字符串操作

沒有字符串的每個頭都在不同的頭下有一個參考點。缺少子標題的標題需要從引用的直接父/繼續標題中獲取子標題。

這裏是什麼樣子:

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 2010-06-28 22:17:06

+0

字符串有多大?有沒有前瞻性的參考? – SLaks 2010-06-28 22:25:35

+0

@SLaks字符串很大。 〜10,000行。我正在做很多其他的東西,所以它很慢。但是這對於這個應用程序來說不是問題,速度並不是必需的。我認爲'reference-header-3'的東西是前向參考? (對不起,如果這不是你的意思。)每個沒有subheader的Header都有一個前向引用,所以最好是循環前向引用而不是每一行。 – Mark 2010-06-28 22:36:39

回答

1

如果你有控制後端,你應該把這些數據作爲JSON發送。這將是最好的選擇。這也是相對無痛的。除非你像我描述的那樣使用AJAX來獲取JSON,否則你也不應該爲此使用jQuery(它在這裏的使用是無關緊要的)。

或者你也可以做這樣的事情:

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 1Header 2等鍵控的地圖。每個鍵的值都是包含各種子標題的數組。您可以輕鬆地遍歷這些值並檢查數組中的第一個值,以查看它是否具有subheader -前綴。如果沒有,你可以添加它。

我剛剛注意到了第二部分。我猜你可以做什麼後,你做了上面的是做第二遍,解析出reference部分,並在那裏插入適當的值。 Slak的解決方案可能是我認爲的一次性解決方案(來自我給出的快速閱讀)。或者你可以在上面的代碼中添加一個else-if(在它檢查hedaer的循環內)來檢查它是否符合你的reference指令。如果是這樣,請抓住現有的引用並添加它(這隻適用於反向引用)。如果你有前向引用,那麼你需要第二遍。

0

您應該遍歷字符串中的行並構建查找表,將標題引用映射到其數據字段,並將每行添加到output數組。

當您遇到標題時,請設置一個標誌來表明您期待着一個子標題。
如果設置了標誌且當前行不是子標題,請在查找表中查找引用,並在實際行之前向輸出數組添加子標題行。

如果最後一行可能是標題,則需要在循環之後重複該檢查。

如果標題後可能出現的參考線,你需要檢查&通過output填充output和填充查找表之後添加副標題中的第二,向後,循環。如果是這樣,你應該通過調用splice來插入副標題。

完成後,請致電output.join('\n')

+0

謝謝,很有道理。我正在考慮它。如果有任何代碼可以分享,那也會很棒。 – Mark 2010-06-28 22:31:55