2011-11-05 14 views
9

Mam dwa ciągi. Ciąg A: "Szybki brązowy lis" Ciąg B: "Szybki brązowy lis przeskakuje nad leniwym psem."JavaScript porównaj łańcuchy i uzyskaj różnicę końcową

Łańcuch B będzie zawsze zawierał ciąg A dosłownie. Nigdy nie będzie "szybkiego czarnego lisa" ani "szybkiego i szybkiego brązowego lisa".

Jak uzyskać "ciąg C" różnicy "przeskakuje nad leniwym psem"?

+1

Praca domowa? W każdym razie, prostym sposobem jest rozpoczęcie od zmiennej długości (nazwij ją "l" lub coś podobnego) i uruchom pętlę, która widzi, czy 'strA.substring (0, l) == strB.substring (0, l)' do niego robi. Następnie zwróć 'strB.substring (l);'. – Alxandr

+1

Opublikuj, co dotychczas próbowałeś. –

+10

'differenceString = string2.replace (string1," ");' o_o? –

Odpowiedz

6

Musisz sprawdzić każde słowo do drugiego.

var s1 = "The quick brown fox", 
    s2 = "The quick brown fox jumped over the fence", 
    string1 = new Array(), 
    string2 = new Array(), 
    diff = new Array(), 
    longString; 

string1 = s1.split(" "); 
string2 = s2.split(" "); 

if(s1.length > s2.length) 
{ 
    longString = string1; 
} 
else 
{ 
    longString = string2; 
} 

for(x = 0; x < longString.length; x++) 
{ 
    if(string1[x] != string2[x]) 
    { 
     diff.push(string2[x]); 
    } 
} 

document.write("The difference in the strings is " + diff.join(" ")); 
+2

"ciąg B zawsze zawiera ciąg A dosłownie" oznacza "nie sprawdzaj słowa po słowie" – Triptych

+0

Czy zawsze będzie przedłużeniem, czy też może być ciągiem A w dowolnym miejscu ciągu B. – comu

+0

Źle zinterpretowałeś pytanie. W twojej odpowiedzi s1 i s2 byłyby złe, ponieważ s2 nie zawiera s1. –

9

Zobacz podstawowy przykład poniżej.
Można to łatwo zmodyfikować/rozszerzyć dla różnych zachowań. Odpowiedź

var string_a = document.getElementById('string_a').innerHTML, 
 
    string_b = document.getElementById('string_b').innerHTML, 
 
    first_occurance = string_b.indexOf(string_a); 
 

 
if(first_occurance == -1) 
 
{ 
 
    alert('Search string Not found'); 
 
} 
 
else 
 
{ 
 
    string_a_length = string_a.length; 
 

 
    if(first_occurance == 0) 
 
    { 
 
    new_string = string_b.substring(string_a_length); 
 
    } 
 
    else 
 
    { 
 
    new_string = string_b.substring(0, first_occurance); 
 
    new_string += string_b.substring(first_occurance + string_a_length); 
 
    } 
 
    
 
    document.getElementById('diff').innerHTML = new_string; 
 
}
<p>String A: <span id="string_a">The quick brown fox</span></p> 
 
<p>String B: <span id="string_b">The quick brown fox jumps over the lazy dog</span></p> 
 
<hr/> 
 
<p>Difference: <span id="diff"></span></p>

+1

Byłem wykładowcą informatyki (lub, w USA, "TA"). To byłaby jedyna odpowiedź, na którą przyznawałbym pełne oceny. To powinna być zaakceptowana odpowiedź. –

+0

@MichaelScheper Zgadzam się, to powinna być zaakceptowana odpowiedź, sformatowałem ją dla lepszej czytelności i zmieniono w fragment kodu, który można uruchomić: – doz87

+1

Fajna, @ Doz87! Sugestie dotyczące dalszego doskonalenia: użyj operatora tożsamości zamiast operatora równości http://stackoverflow.com/questions/359494/which-equals-operator-vs-should-be-used-in-javascript-comparisons i camelCase nazw zmiennych zamiast te with_underscores http://www.w3schools.com/js/js_conventions.asp Ale żaden z tych problemów nie wpływa na poprawność ani przydatność tej odpowiedzi. –

7

comu jako funkcję ...

function compareString(s1, s2, splitChar){ 
    if (typeof splitChar == "undefined"){ 
     splitChar = " "; 
    } 
    var string1 = new Array(); 
    var string2 = new Array(); 

    string1 = s1.split(splitChar); 
    string2 = s2.split(splitChar); 
    var diff = new Array(); 

    if(s1.length>s2.length){ 
     var long = string1; 
    } 
    else { 
     var long = string2; 
    } 
    for(x=0;x<long.length;x++){ 
     if(string1[x]!=string2[x]){ 
      diff.push(string2[x]); 
     } 
    } 

    return diff;  
} 
compareString("?Yo=dude", "?Yo=Dude&do=roby", "&").join('\n'); 
compareString("?Yo=Dude", "?Yo=Dude&do=roby", "&").join('\n'); 

Uwaga: ta odpowiedź rozwiązuje problem znalezienia extra parametrów zapytania (w oparciu o inny ciąg zapytań), i nie jest dokładną odpowiedzią na PO.

+1

To dość przesadzone rozwiązanie !! ~ Rozwiązanie Ghost-Mana jest co najmniej o rząd wielkości bardziej wydajne! http: // stackoverflow.com/a/8024608/1450294 –

+2

To jest uczciwy komentarz. Michael: Nie odpowiedziałem na oryginalne pytanie, ale napisałem rozwiązanie problemu, który miałem w tym czasie. Myślę, że musiałem to zrobić, ponieważ to był problem, który próbowałem rozwiązać i to była odpowiedź comu, która pomogła mi, więc napisałem kod, którego użyłem. Zaktualizuję moją odpowiedź, aby odzwierciedlić, że nie odpowiada dokładnie na pytanie. – chim

+2

Odpowiedź Ghost Mana powinna być zaakceptowaną odpowiedzią. – chim

1

Sprawdź tę witrynę pod kątem wspaniałego API, aby zobaczyć różnicę między ciągami: google-diff-match-patch Może być konieczne sprawdzenie interfejsu użytkownika zgodnie z potrzebą.

Powiązane problemy