拼接未删除某些字符

Splice NOT removing certain characters

本文关键字:字符 删除 拼接      更新时间:2023-09-26

我正在处理一些代码战争问题,我想到了这个"去除噪音的东西",我想重点是转义反斜杠''并使用replace方法,这很容易。但我不想使用替换,相反,我发现自己在尝试用拼接方法删除项目时遇到了麻烦。

有趣的是,当我在Chrome开发工具中调试时,我一步一步地看到项目被删除,但console.log吐出某些有问题的字符($/·|ªl)来删除,最后返回并与这些字符连接。为什么?

function removeNoise(str) {
  var base = "%$&/#·@|º'ª";
  var arr = str.split('');
  for(var i = 0; i < arr.length; i++) {
    var item = arr[i];
    var condition = base.indexOf(item);
    if(condition + 1) {
      //works like a charm
      //arr[i] = '';
      arr.splice(i,1); 
      //this thing wont work
      //when debugging it removes the items from the array
      //console log print no removing
    }
  }
  return arr.join(''); 
}
removeNoise('he%$&/#·@|º'ª'llo'); //=> $/·|ªllo

您使用splice从数组中删除条目,但随后会为下一个循环递增i。如果从10个条目的数组中删除索引5处的条目,那么索引6处的条目现在位于索引5(现在是9个条目的阵列),因此您不想增加索引。

解决方案是使用while循环,并且仅在splice:的情况下更新i

function removeNoise(str) {
  var base = "%$&/#·@|º'ª";
  var arr = str.split('');
  var i = 0;
  while (i < arr.length) {
    var item = arr[i];
    var condition = base.indexOf(item);
    if (condition + 1) {
      // Remove this entry, reuse same value for 'i'
      arr.splice(i,1); 
    } else {
      // Don't remove this entry, move to next
      ++i;
    }
  }
  return arr.join(''); 
}
var result = removeNoise('he%$&/#·@|º'ª'llo');
var pre = document.createElement('pre');
pre.appendChild(
  document.createTextNode(result)
);
document.body.appendChild(pre);

您正在从数组中删除字符。这将使索引器变量i与要测试的字符不同步。简单的修复方法是从数组的末尾开始,一直到开头。

将for循环更改为此。

for(var i = arr.length -; i <= 0; i--) {

function removeNoise(str) {
  var base = "%$&/#·@|º'ª";
  var arr = str.split('');
  for(var i = arr.length - 1; i <= 0 ; i--) {
    var item = arr[i];
    if(base.indexOf(item) >= 0) {
      //remove the offending character
      arr.splice(i,1); 
    }
  }
  return arr.join(''); 
}
removeNoise('he%$&/#·@|º'ª'llo'); //=> $/·|ªllo