2017-10-12 48 views
1

我有兩個大的相應的查找/替換載體,例如運行復雜查找/替換javascript中大量文本的所有方法的最有效方法?

find = [find1,find2,find3...] 
replace = [replace1,replace2,replace3...] 

查找和替換載體包含字符串瓦爾。

問題是關於在大量文本上運行復雜查找/替換的最有效方法。

我目前使用分流/加入,例如:

var.split(foo).join(bar1)) 

這工作,但(不出所料)爲var變大和找到替代向量變得更加複雜,操作大幅放緩的變種是反覆擴大並與每個替代品簽約。

我考慮:

  • 切換到查找/替換使用正則表達式
  • 試圖引進一個位異步

,但我感興趣的是這個社區的人都知道,或者如果有人嘗試過類似的東西並有觀察結果?

+2

你能澄清一下嗎? *您想要查找/替換的數據是什麼* *您正在使用的實際查找/替換向量是什麼* *您當前的實施(代碼中)是什麼? https://stackoverflow.com/help/mcve – Svenskunganka

+0

@Svenskunganka感謝您的答覆。我沒有粘貼載體,因爲它們每個都包含數千個元素。這些元素是文本字符串,如果這有幫助的話。 find1和replace1之間沒有可靠的關係。 – Rookie

+0

你所要求的內容太寬泛。這個問題沒有明確的答案,因爲效率的變化很大,取決於你想要執行查找/替換操作的實際數據。 – Svenskunganka

回答

2

字符串在JavaScript中是不可變的,所以您不能在原地更改它。這是我的實現。我將它轉換爲一個單詞數組,並搜索find-replace鍵值對的對象。 O(1)查找,O(n)用於分割,替換和連接。

const findReplace = { 
    find1: 'replace1', 
    find2: 'replace2', 
    find3: 'replace3' 
} 
const textBody ='find1 find2 word word2' 
const textArray = textBody.split(" ") 
const replacedArray = textArray.map(word => { 
    return findReplace[word] ? findReplace[word] : word 
}) 
replacedArray.join(" ") //'replace1 replace2 word word2' 

編輯:既然你的數據是否已在兩個數組存在,您可以在運行替換算法之前建立自己的對象了出來。你真的需要O(1)查找,所以不要跳過這個。

const find = ['find1', 'find2', 'find3'] 
const replace = ['replace1', 'replace2', 'replace3'] 
findReplace = {} 
for (let i = 0; i < find.length; i++) { 
    findReplace[find[i]] = replace[i] 
} 

console.log(findReplace) //{ find1: 'replace1', find2: 'replace2', find3: 'replace3' } 
+0

我只是稍微改變它,所以findReplace變量硬編碼,所以它不必每次腳本加載時都會形成這個,但這是一個非常好的答案。與我以前的迭代搜​​索和替換過程相比,性能的提高非常明顯。謝謝! – Rookie

+0

總是樂於提供幫助。該算法是O(3n) - > O(n)。最初的嘗試是O(n^2)。它將在以後進一步擴展。 – Andrew

相關問題