因此,我编写了一个代码来替换某些单词并生成最可能相关的术语。
例如:"st vin st vin"必须给我一个数组["st vin st vin",圣文,圣文圣文,’st。vin st vin’,’st。文圣,]
const getRelatedTerms =async searchTerm =>{
const likeTerms=[
{good:'st', bad:'saint'},
{good:'st', bad:'st.'},
{good:'st.', bad:'saint'},
{good:'st.', bad:'st'},
{good:'saint', bad:'st.'},
{good:'saint', bad:'st'}
]
const arr=[];
for(let i=0; i< likeTerms.length; i++){
let temp =searchTerm;
let item = likeTerms[i];
while(temp.includes(item.good)){
temp = temp.replace(item.good,item.bad);
arr.push(temp)
}
}
}
我不确定这里到底出了什么问题。它抛出CALL_AND_RETRY_LAST分配失败-JavaScript堆内存不足错误
您的代码处于无限循环中。
作为无限循环的一个例子,请考虑:您的输入字符串是"st vin"
将"st"
替换为"st."
,使字符串成为"st. vin"
然后检查"st. vin"
是否包含"st"
(确实包含(,然后再次替换它,现在生成字符串"st.." vin
。这种情况将永远重复。
有几种方法可以解决这个问题。最简单的方法可能是使用.replaceAll()
。
const getRelatedTerms = searchTerm =>{
const likeTerms=[
{good:'st', bad:'saint'},
{good:'st', bad:'st.'},
{good:'st.', bad:'saint'},
{good:'st.', bad:'st'},
{good:'saint', bad:'st.'},
{good:'saint', bad:'st'}
]
const arr = [];
for(let i = 0; i < likeTerms.length; i++) {
const item = likeTerms[i];
arr.push(searchTerm.replaceAll(item.good, item.bad));
}
return arr;
}
还要注意函数中的另外两个错误:使用async
函数声明,但函数是同步的,因此不需要async
。最后也不会返回arr
,这在上面的代码中已经完成。
附加重构
如果你愿意,你也可以继续简化函数。您可以将好和坏的声明移到函数之外,因为似乎不需要每次都重新创建它。您可以将循环更改为映射,映射返回一个数组,这样您就可以在一行中创建函数。如果一个函数只有一个表达式,则可以移除包装{
和}
,并移除return
语句。这是使用";胖箭头";函数(=>
(
const likeTerms = [
{good:'st', bad:'saint'},
{good:'st', bad:'st.'},
{good:'st.', bad:'saint'},
{good:'st.', bad:'st'},
{good:'saint', bad:'st.'},
{good:'saint', bad:'st'}
];
const getRelatedTerms = searchTerm => likeTerms.map(
({ good, bad }) => searchTerm.replaceAll(good, bad)
);