拼接不删除某些字符

时间:2016-05-16 08:59:26

标签: javascript

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

有趣的是,当我在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

2 个答案:

答案 0 :(得分:7)

您正在使用splice 删除阵列中的条目,但是您需要为下一个循环递增i。如果从10条目数组中删除索引5处的条目,则索引6处的条目现在位于索引5(现在是9条目数组),所以您不想要增加你的指数。

解决方案是使用while循环,只有在 i时才更新splice

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 1 :(得分:2)

您正在从阵列中删除字符。这会使您的索引器变量ADD与您要测试的字符不同步。简单的修复方法是从阵列的最后开始,直到开始。

将for循环更改为此。

i

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