将字母替换为字母位置,为什么拼接不删除多个字符



我有以下代码。

var list = input => {
let array = input.split('').map(ch => ch.toLowerCase().charCodeAt(0) - 96);
for(let el in array) {
if(array[el] < 1 || array[el] > 26)
array.splice(el,1);
}
return array.toString().replace(/,/g, ' ');
}
console.log(list("The sun!!!set sets at twelve o' clock."));
// output
//20 8 5 19 21 14 -63 19 5 20 19 5 20 19 1 20 20 23 5 12 22 5 15 -64 3 12 15 3 11

为什么拼接不删除行中的多个字符?特殊字符只有出现在字母之间时才会被删除。如何更改代码以仅实现字母表中字母的位置?

在循环中使用splice((不是一个好主意。您正在更改循环内容的长度。

请改用filter()来排除不需要的值。您也可以使用带有空格分隔符的join()

var list = input => {
return input.split('')
.map(ch => ch.toLowerCase().charCodeAt(0) - 96)
.filter(n => n > 0 && n < 27)
.join(' ');
}
console.log(list("The sun!!!set sets at twelve o' clock."));

如果你确实想拼接((,那么最安全的做法是通过数组反向工作

for(let i = array.length-1; i >= 0; i--) 

然后你不会改变你还没有访问过的元素的索引

您正在通过迭代数组

for(let el in array)

并且您仍然通过从相同的数组中删除元素

array.splice(el,1);

您不能这样做,因为如果删除一个元素,数组会变短一个元素。但这不会反映在迭代中。

相反,通过数字元素索引(在循环条件下仍检查数组的当前长度(进行正常迭代,然后增加索引或删除元素:

if(array[i] < 1 || array[o] > 26)
array.splice(i,1)
else
i++;

最新更新