array.splice两次返回一个值

时间:2016-10-03 13:26:25

标签: javascript arrays

我有这个函数用indexOf(之前)替换一个名为“after”的字符串的数组元素。这几乎可以正常工作,除了我得到两个“后”值而不是一个

这是我的代码:

function myReplace(str, before, after) {
  var strArr = []; 
  strArr = str.split(' ');
  for (var i = 0; i < strArr.length; i++) {
    strArr.splice(strArr.indexOf(before), 1, after);
  }
  return strArr;
}

myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped");

以及它返回的内容:

[“A”,“quick”,“brown”,“fox”,“leaped”,“over”,“the”,“lazy”,“leaped”]

出了什么问题?

4 个答案:

答案 0 :(得分:2)

啊这里的问题相当不吉利!这是因为在找到元素4之后,indexOf返回-1(表示未找到的方式),并从数组中替换最后一个(-1)。

function myReplace(str, before, after) {
  var strArr = []; 
  strArr = str.split(' ');
  for (var i = 0; i < strArr.length; i++) {
    var index = strArr.indexOf(before);
    if(index!=-1){
        strArr.splice(index, 1, after);
    }
  }
  return strArr;
}

希望这有帮助。

答案 1 :(得分:1)

如果您只想更换,请保持简单

var regex = new RegExp("jumped", "gi");
var output = "A quick brown fox jumped over the lazy dog".replace( regex, "leaped" );
console.log(output);

您可以阅读有关RegExp here

的更多信息

答案 2 :(得分:1)

当没有找到元素时,Array.prototype.splice返回-1:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf

所以在第一个循环中,它将取代&#34;跳跃&#34;通过&#34;跳跃&#34;正如所料,但对于所有其他,它将strArr(-1, 1, after),这意味着它将用after替换最后一个元素。

这里的问题是你的for循环,它会检查表中的每个元素之前是否存在。您必须使用上面链接中提供的示例中的while循环(查看查找元素的所有匹配项)

答案 3 :(得分:0)

使用此:

function myReplace(str, before, after) {
   var strArr = []; 
   strArr = str.split(' ');
   for (var i = 0; i < strArr.length; i++) {
      if(strArr[i] === before){
         strArr[i] = after;
      }
   }
   return strArr;
}

myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped");