在循环中调用时拼接不删除元素

时间:2015-01-10 00:30:39

标签: javascript

我正在编写一个代码,它接受一个输入字符串和一组标记,并删除从标记到找到它的末尾的所有内容。我有一个功能,它识别一个标记,然后找到它所在的行的结尾。此函数返回一个数组,其中每对元素(从0开始)对应于我想要拼接的部分。但是,我对splice的一些调用实际上只删除了任何内容。

这是我的主要代码:

function solution(input, markers){
  var positions = identify(input, markers);
  var arr = input.split('');

  for(var i = 0; i<positions.length; i+=2){
    arr.splice(positions[i], positions[i+1] - positions[i]);
    console.log(positions[i+1]);
  }
  return arr.join('');
}

我已经测试了识别并且它正在返回我期望的内容。这是我目前失败的测试:

Test.assertEquals(solution("apples, pears # and bananas\ngrapes\nbananas !apples", ["#", "!"]), "apples, pears\ngrapes\nbananas")

我对identify()的调用的结果是[14,27,43,50]并且我已经尝试直接拼接(43,7),这是有效的,所以我无法弄清楚为什么它没有删除任何元素在循环中使用。我总是得到这个结果:

预计:苹果,梨 葡萄 香蕉

取而代之的是:苹果,梨 葡萄 香蕉!苹果

1 个答案:

答案 0 :(得分:3)

你需要在positions数组中向后工作,因为当你拼出arr的某些元素时,这些元素之后的所有内容的索引都会发生变化。

function solution(input, markers){
  var positions = identify(input, markers);
  var arr = input.split('');

  for(var i = positions.length-2; i >= 0; i-=2){
    arr.splice(positions[i], positions[i+1] - positions[i]);
    console.log(positions[i+1]);
  }
  return arr.join('');
}