Javascript字符串一次替换一个字符串并添加到数组中



因此,我编写了一个代码来替换某些单词并生成最可能相关的术语。

例如:"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)
);

最新更新