2015-05-18 52 views
3

在採取一種奇怪的輸出並將其轉換爲可讀的劇本格式時遇到了一些麻煩。Jquery:與一審對比

所以這裏是HTML。

<div> 
<p class="actor">John</p> 
<p class="line">I want to buy milk.</p> 
<p class="actor">John</p> 
<p class="line">Milk is expensive.</p> 
<p class="dirNote">John grabs the milk</p> 
<p class="actor">John</p> 
<p class="line">I guess its fine.</p> 
<p class="actor">Steve</p> 
<p class="line">Yeah.</p> 
</div> 

我的嘗試已經解決了這個失敗。但基本的思路是這樣的......

遍歷p.actor
店一審的每個實例作爲一個變種

檢查下一個實例對無功

,如果它們是相同的

追加該實例的p.line的內容爲VAR

其他的p.line取代VAR

新p.actor

而且,如果p.actor的邂逅p.dirNote下一個實例樹立了新的變種

基本完成時的HTML應該是這樣的

<div> 
<p class="actor">John</p> 
<p class="line">I want to buy milk. Milk is expensive.</p> 
<p class="dirNote">John grabs the milk</p> 
<p class="actor">John</p> 
<p class="line">I guess its fine.</p> 
<p class="actor">Steve</p> 
<p class="line">Yeah.</p> 
</div> 

任何思考可行性?謝謝。

+0

你有什麼試過?究竟是什麼問題?你的JS代碼也可能有幫助。 –

+0

第三個約翰呢? –

+1

如果(牛奶很貴)(牛奶價格昂貴)和(約翰抓住牛奶並跑出超市,他被警察槍殺),爲什麼(約翰抓住牛奶):)) – Tasos

回答

2

下面的代碼片段應該會有技巧。它基本上將集合轉換爲數組,並從集合中的最後一個元素開始。

$('p.actor').toArray().reverse().forEach(function (el) { 
    var 
     $this = $(el), 
     $prev = $this.prev().prev('.actor'), 
     $line 
    ; 

    if ($this.text() !== $prev.text()) { 
     return; 
    } 

    $line = $this.next('.line'); 
    $prev.next('.line').append(' ' + $line.text()); 
    $this.add($line).remove(); 
}); 

http://jsfiddle.net/j9qwzyzq/

+0

這是完全正確的。謝謝。 – user2859646

+0

@ user2859646不客氣! – undefined

0

我有一個半爲你解答。它比我更進化,所以我現在就停下來。

它遍歷你的段落,跟蹤它們的類型並重建一個新列表。它仍然需要弄清楚如何跟蹤前一個(或下一個)線/演員和addRow。希望它有幫助...

var rows = $("#my-list p"), 
newRows = [], 
currentActor = null, 
currentLine = null, 
addRow = function (type, value) { 
    newRows.push({ 
     type: type, 
     value: value 
    }) 
}; 

rows.each(function (index) { 
    var $row = $(this), 
     className = $row.attr("class"), 
     isActor = className == "actor", 
     isLine = className == "line", 
     isDirNote = className == "dirNote", 
     content = $row.text(); 

    if (isLine) { 
     //TODO: keep track of line to be appended to next item (if same actor) 
     //TODO: if next element is same actor, append line 
     //addRow(className, content); 
    } 
    if (isDirNote || isActor) { 
     addRow(className, content); 
    } 
    console.log(content, isActor, isLine, isDirNote); 
}) 

console.log(newRows); 

//TODO: build new paragraph array from newRows