2014-03-25 17 views
1

我一直在試圖寫一個字符,它變得混亂!JavaScript程序找到一個字符串中的字符,但沒有在另一個字符串中

假設我有兩個字符串textStart,textTarget,我想跟蹤我需要添加和刪除的字符,以便從textStart爲了產品textTarget

例如,如果textStart = "dude"textTarget = "deck",那麼這將需要被添加的字符將是'c''k'並且將需要被中減去字符將是'u''d' S的一個。

我在想,我首先需要創建代表textStarttextTarget中每個字符數的地圖。

所以我寫了這一點:

var startChars = {}; 
    for (var k = 0, n = textStart.length; k < n; ++k) 
    { 
     if (textStart[k] in startChars) 
      ++startChars[textStart[k]]; 
     else 
      startChars[textStart[k]] = 1; 
    } 
    var targetChars = {}; 
    for (var k = 0, n = textTarget.length; k < n; ++k) 
    { 
     if (textTarget[k] in startChars) 
      ++targetChars[textTarget[k]]; 
     else 
      map1[targetChars[k]] = 1; 
    } 

這將使我

startChars['d'] = 2startChars['u'] = 1startChars['e'] = 1

targetChars['d'] = 1targetChars['e'] = 1targetChars['c'] = 1targetChars['k'] = 1

然後我可以創建地圖needAddedneedRemoved看起來在上面兩張圖的區別:

var needAdded = {}; 
    var needRemoved = {}; 

我我不知道如何按照預期填充這些地圖,因爲我不知道如何使用JavaScript遍歷地圖的鍵。不知何故,我需要

needAdded['c'] = 1needAdded['k'] = 1needRemoved['u'] = 1needRemoved['d'] = 1

這就是你們進來幫我結束了。

我希望我已經做得很好,描述了我正在嘗試做什麼以及我迄今爲止如何嘗試做到這一點。我的編程直覺告訴我,我寫了太多的代碼行,並且需要諮詢StackOverflow來尋求幫助。任何方式沒有JQuery或正則表達式優雅地做到這一點?我知道有人會進入這個線程,寫一條1行Regex解決方案或類似的東西。

+2

要循環通過對象使用'for(var key在對象中){}' –

+0

你有什麼反對正則表達式?這不是我認爲這很有用。 –

+1

就「太多的代碼」而言,您可以重構循環以將您的地圖構建爲函數,因此您只需要編寫一次。然後使用'for ... in'作爲@ A.O。建議(也可以堅持在一個函數,因爲你需要循環兩個對象的屬性)。 –

回答

0
var s = 'dude', 
t = 'deck', 
finalOutput = ''; 
for (var i = 0; i < s.length; i++){ 
    if (typeof t[i] != 'undefined'){ 
     if (s[i] != t[i]){ 
      console.log(s[i] + ' changed to ' + t[i]); 
      s[i] = t[i]; 
      finalOutput += t[i]; 

     } else{ 
      finalOutput += s[i]; 
     } 
    } 
} 
console.log('FINAL: ' + finalOutput); 
0

這是jsfiddle我只是花了太多時間在......希望這是有道理的:)

var textStart = 'dude'; 
var textTarget = 'deck'; 

var startChars = {}; 
for (var k = 0, n = textStart.length; k < n; ++k) 
{ 
    if (textStart[k] in startChars) 
     ++startChars[textStart[k]]; 
    else 
     startChars[textStart[k]] = 1; 
} 

var targetChars = {}; 
for (var k = 0, n = textTarget.length; k < n; ++k) 
{ 
    if (textTarget[k] in targetChars) 
     ++targetChars[textTarget[k]]; 
    else 
     targetChars[textTarget[k]] = 1; 
} 

console.log('start: ' + JSON.stringify(startChars)); 
console.log('target: ' + JSON.stringify(targetChars)); 

var needAdded = {}; 
var needRemoved = {}; 

for (var c in startChars) { 
    // If target does not contain letter, remove all, otherwise remove excess 
    if (targetChars[c] > 0) { 
     if (startChars[c] > targetChars[c]) 
      needRemoved[c] = startChars[c] - targetChars[c]; 
     else if (startChars[c] < targetChars[c]) 
      needAdded[c] = targetChars[c] - startChars[c]; 
    } else { 
     needRemoved[c] = startChars[c]; 
    } 
} 

for (var c in targetChars) { 
    // If start does not contain letter, add all, otherwise add excess 
    if (startChars[c] > 0) { 
     if (startChars[c] > targetChars[c]) 
      needRemoved[c] = startChars[c] - targetChars[c]; 
     else if (startChars[c] < targetChars[c]) 
      needAdded[c] = targetChars[c] - startChars[c]; 
    } else { 
     needAdded[c] = targetChars[c]; 
    } 
} 

console.log('needAdded: ' + JSON.stringify(needAdded)); 
console.log('needRemoved: ' + JSON.stringify(needRemoved)); 

輸出如下:

start: {"d":2,"u":1,"e":1} 
target: {"d":1,"e":1,"c":1,"k":1} 
needAdded: {"c":1,"k":1} 
needRemoved: {"d":1,"u":1} 
0

好吧,就這也太多時間:

var textStart = "dude"; 
var textTarget = "duck"; 

var map = {}; 
MapCharacters(textStart, map, 1); 
MapCharacters(textTarget, map, -1); 
console.log(map); 

var toDelete = []; 
var toAdd = []; 

for (var prop in map) { 
    if (map.hasOwnProperty(prop)) { 
     while (map[prop] > 0) { 
      toDelete.push(prop); 
      map[prop]--; 
     } 
     while (map[prop] < 0) { 
      toAdd.push(prop); 
      map[prop]++; 
     } 

    } 
} 

console.log(toDelete); 
console.log(toAdd); 

function MapCharacters(string, map, add) { 
    for (var k = 0, n = string.length; k < n; ++k) { 
     if (string[k] in map) { 
      map[string[k]] += add; 
     } else { 
      map[string[k]] = add; 
     } 
    } 
} 

http://jsfiddle.net/nSV2J/1/

很可能它做得更有效率,但正如我所說 - 太多時間了!

我意識到要做到這一點的最佳方法不是製作兩張地圖,而只是一張。在第一種情況下,你增加每個字母的計數,在第二種情況下減少它。現在很容易找到哪些需要刪除(最後>> 0)和哪些需要添加(最後< 0)

相關問題