2013-06-06 5 views
0

Как написать скрипт в javascript, который проверяет все строки ("Line1\nLine2\nLine3...") в строке, и если есть повторяющиеся строки, то просто оставить один и игнорировать теги br?Как удалить повторяющиеся строки из строки?

var s = "Hello world\n<BR>\nThis is some text\nThis is some text\n<BR>\nThis is some text" 
line1 = "Hello world" 
line2 = "<BR>" 
line3 = "This is some text" 
line4 = "This is some text" 
line5 = "<BR>" 
line6 = "This is some text" 

var result = "Hello world\n<BR>\nThis is some text\n<BR>" 
line 1 = "Hello world" 
line 2 = "<BR>" 
line 3 = "This is some text" 
line 4 = "<BR>" 
+0

разделить на \ n, пропустить через массив, игнорировать
, установить в хэш, если он находится в хеш, чем удалить, после того, как цикл объединяется. – epascarello

+0

вопрос обновлен, пожалуйста, проверьте его сейчас – maniootek

ответ

1
var pieces = s.split("\n"); //This will split your string 
var output = []; //Output array 

for (var i = 0; i < pieces.length; i++) { //Iterate over input... 

    if (pieces[i] == '<BR>' || output.indexOf(pieces[i]) < 0) { //If it is <BR> or not in output, add to output 
     output.push(pieces[i]); 
    } 

} 

var newS = output.join("\n"); //Concatenates the string back, you don't have to do this if you want your lines in the array 

Здесь мы имеем jsFiddle: http://jsfiddle.net/7s88t/

Для вас знания, функция indexOf возвращает позицию, где pieces[i] находится в выходном массиве. Если он не найден, он возвращает -1. Вот почему я проверяю, меньше ли оно.

Надеюсь, я помог.

EDIT

Как вы просили, чтобы принять нижний регистр:

if (pieces[i].toLowerCase() == '<br>' || pieces[i].toLowerCase() == '<br/>' || pieces[i].toLowerCase() == '<br />' || output.indexOf(pieces[i]) < 0) { 
+0

делает это в этом порядке: 1 & 2, 2 & 3, 3 & 4 ?? Если да, то как проверить 1 и 3? – maniootek

+0

не мог понять ваш вопрос. пожалуйста, будьте яснее. мой код переходит от строки fisrt к последнему, добавляя каждый из них в вывод, если он никогда не появлялся или был
. –

+0

жаль, что я ошибся, просто забудьте. Он работает очень хорошо, но он не имеет особого значения. Вы знаете, как изменить его? – maniootek

0

1) делят текст в массив по линии разрыва:

var arr = s.split("\n"); 

2) Удалить все дублирующие записи:

var str; 
for(var i=0; i<arr.length; i++) { 
    str = arr[i]; 
    //Takes into account all bad forms of BR tags. Note that in your code you are using 
    //invalid br tags- they need to be <br /> (self-closing) 
    if(inArray(str, arr) && str != "<br>" && str != "<br/>" && str != "<br />"){ 
     arr.splice(i, 1); 
    } 
}; 

function inArray(needle, haystack) { 
    var length = haystack.length; 
    for(var i = 0; i < length; i++) { 
     if(haystack[i] == needle) return true; 
    } 
    return false; 
} 

3) Сделать их обратно в строку

//Note joining with newline characters will preserve your line outputs :) 
var output = arr.join("\n"); 

Этот подход хорош тем, что позволяет избежать использования регулярных выражений, даже не нужно рассматривать <br /> тегов и использует собственные JS означает, что вы можете поместить его в любом месте вы хотите , Я не тестировал этот код, я просто написал его, чтобы он мог содержать ошибки. Но это должно быть хорошей отправной точкой. Приветствия!

+1

Прежде чем использовать * inArray *, вы можете сначала протестировать ['Array.prototype.indexOf'] (http://www.ecma-international.org/ecma-262/5.1 /#sec-15.4.4.14), что, вероятно, будет намного быстрее, если оно доступно. О, и вам нужно только проверить текущий индекс до конца, а не весь массив. – RobG

+0

Что сказал @RobG. Мое было быстро, но он прав, вы должны добавить эти другие вещи. – dudewad

+0

Вы не принимаете
во внимание, как хочет OP. –

Смежные вопросы