2011-11-05 72 views
9

我有兩個字符串。 字符串A:「快速的棕色狐狸」 字符串B:「快速的棕色狐狸跳過懶惰的狗。」Javascript比較字符串並獲得最終差異

字符串B將始終包含字符串逐字。永遠不會有「快黑狐狸」或「快速而快速的棕狐狸」。

如何得到一個「字符串C」的差異「跳過懶狗」。

+1

作業?無論如何,一個簡單的方法是從一個長度變量開始(調用它'l'或者其他)並運行一個循環來查看是否有'strA.substring(0,l)== strB.substring(0,l)'直到它犯規。然後,返回'strB.substring(l);'。 – Alxandr

+1

請發佈您到目前爲止所嘗試的內容。 –

+10

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

回答

6

你需要交叉檢查每個單詞到另一個。

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

「字符串B將始終包含字符串逐字」意味着「不要逐字檢查」 – Triptych

+0

它將始終是擴展名,或者字符串A可能在字符串B中的任何位置。 – comu

+0

您錯誤地解釋了該問題。在你的回答中,s1和s2是錯誤的,因爲s2不包含s1。 –

9

請參閱下面的基本示例。
這可以很容易地修改/擴展爲不同的行爲。

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

我曾經是一名計算機科學導師(或在美國,'TA')。這將是我獲得滿分的唯一答案。它應該是被接受的答案。 –

+0

@MichaelScheper我同意,這應該是被接受的答案,我已經格式化爲更好的可讀性,並轉化爲可運行的代碼片段 – doz87

+1

好的,@ doz87!進一步改進的建議:使用身份運算符而不是等號運算符http://stackoverflow.com/questions/359494/which-equals-operator-vs-should-be-used-in-javascript-comparisons和camelCase變量名稱代替一些with_underscores http://www.w3schools.com/js/js_conventions.asp但這些問題都不影響這個答案的正確性和有用性。 –

7

COMU的回答作爲一個功能...

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'); 

注:這個答案找到解決額外查詢參數的問題(基於另一個查詢字符串)並不是OP的確切答案。

+1

這是一個相當過度的解決方案! 〜幽靈人的解決方案至少比效率高一個數量級! HTTP://計算器。com/a/8024608/1450294 –

+2

這是一個公平的評論@邁克爾我沒有回答原來的問題,但發佈了一個解決方案,當時我遇到的問題。我想我一定是這樣做的,因爲這是我想解決的問題,這是comu的回答,幫助我,所以我發佈了我使用的代碼。我會更新我的回答,以反映它不能完全回答問題。 – chim

+2

鬼人的答案應該是被接受的答案。 – chim

1

看看這個網站有一個很棒的API來看看字符串之間的區別:google-diff-match-patch 雖然你可能需要根據你的需要來檢查UI。