2017-10-12 43 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

相关问题