在JavaScript中,基于ASCII码从字符串中删除字符

4

如果我有一个给定的字符串,使用JavaScript,是否可以根据ASCII码删除其中某些字符并返回剩余的字符串,例如从字符串中删除ASCII码< 22的所有字符?

4个回答

7

事实证明,有很多不同的解决方案,以下是一个简短的概述(从最快到最慢排序)

一个简单的for循环

let finalString = "";
for(let i = 0; i < myString.length; i++ ) {
   if(myString.charCodeAt(i) < 22) continue;
   finalString += myString.charAt(i);
}

速度(针对下面的基准测试):82,600次操作/秒 ±1.81%

在对字符串进行分割和过滤后的循环中

const newStringArray =  myString.split("").filter(e => e.charCodeAt(0) > 22)

let finalString = ""
for(let i = 0; i < newStringArray.length; i++ ) {
   finalString += newStringArray[i]
}

速度 (基准测试结果):55,199个操作/秒 ±0.53%
比原来慢了33.17%

.join 的单行代码

const newString = myString.split("").filter(e => e.charCodeAt(0) >= 22).join("");

速度(针对下面的基准测试):18,745次操作/秒 ±0.28%
比原来慢了77.31%

使用.reduce的一行代码

const newString =  myString.split("")
  .filter(e => e.charCodeAt(0) > 22)
  .reduce( (acc, current) => acc += current, "");

速度(下面基准测试的结果):17,781次操作/秒,误差±0.23%
慢78.47%

基准测试

基准测试可以在此找到:https://jsbench.me/50k8zwue1p
https://jsbench.me/50k8zwue1p


1
我认为条件应该反过来写 e => e.charCodeAt(0) >= 22 - Radu Diță
有趣的是,如果你让reducer函数保持纯净,这样它在每次调用时都创建一个新的字符串,那么它比“acc += current”版本略快一点: const newString = myString.split("").filter(e => e.charCodeAt(0) > 22).reduce( (acc, current) => acc + current, ""); - n3ko

0
你可以遍历字符串,对于每个字母使用 charCodeAt(letter) 方法,这样你就知道它的 ASCII 码,然后就可以执行你的 if 语句了。

0

是的,可以使用JavaScript的str.charCodeAt()方法实现。 您可以将给定的字符串转换为字符数组,然后使用map方法将每个字符与要比较的ASCII代码进行比较。
这将返回一个遵循条件的新数组,然后您只需连接该数组以再次形成字符串即可。


0

对于大字符串来说,连接可能比join更快。

因此,在@WolveringDEV的答案基础上,您可以循环遍历数组并进行连接,而不是使用join。

const newStringArray =  myString.split("")
 .filter(e => e.charCodeAt(0) > 22)

let finalString = ""

for(let i = 0; i < newStringArray.length; i++ ) {
   finalString += newStringArray[i]
}

连接字符串的最低效方法是使用这种方式。所以我的方法在最坏情况下也是相等的。快速运行基准测试表明,“join”实际上要快得多:https://jsbench.me/50k8zwue1p - WolverinDEV
我们的条件被颠倒了,所以你的测试结果不相关。 - Radu Diță
注意到了并修复了 ;) - WolverinDEV
我认为你的代码运行速度减慢大约5%的原因是调用了lambda函数。使用.join则没有这样的开销 ;) - WolverinDEV
你是对的,我改用了普通的for循环,速度变快了。我使用了你的测试并稍作修改 https://jsbench.me/50k8zwue1p/1 - Radu Diță
事实证明,有一种更快的方法。我已经更新了我的帖子。 - WolverinDEV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接