为什么拼接不能在这个for循环中工作?

时间:2016-07-16 17:56:01

标签: javascript arrays splice

var arr = ['apples','oranges','pears','grapes'];

for (var i=0; i<arr.length; i++) {
  if (arr[i] == 'pears') {
    arr.splice(i,0,'limes');
  }
}

当我尝试在jsfiddle中运行时,页面会冻结。如果我使用特定索引代替i(arr.splice(2,0,'limes'))或者我尝试删除项目(arr.splice(2,1)),jsfiddle也会冻结。如果我在没有for循环的情况下执行此操作而是选择特定索引,它将起作用。这有什么不对?有什么方法可以在for循环中进行拼接工作(用于添加,而不是删除项目)?

此外,当我使用FreeCodeCamp的编辑器使用此代码时,它不会冻结,但它会让我回原始数组,就像从未使用过splice一样。但是,如果我为它分配一个变量(for循环中为var rem = arr.splice(i,1)),它会返回已删除的项而不实际修改数组本身(数组保持完全相同)。

3 个答案:

答案 0 :(得分:3)

arr.splice(i,0,'limes'); 

会在, 有效地将一个位置移向阵列的末端, 所以在下一次迭代中,你的代码会再次点击'pears', 并在它前面注入一个“酸橙”等等。

您可以通过添加

轻松查看此内容
console.log(arr);

在你的if块之后,这将产生如下输出:

    ["apples", "oranges", "limes", "pears", "grapes"]
    ["apples", "oranges", "limes", "limes", "pears", "grapes"]
    ["apples", "oranges", "limes", "limes", "limes", "pears", "grapes"]
    ["apples", "oranges", "limes", "limes", "limes", "limes", "pears","grapes"]
    ... 

答案 1 :(得分:1)

你有一个无限循环。您在梨之前添加新元素而不是删除它。所以下一次迭代会再次给你梨。如果这是你的意图,只需添加一个break语句。如果要替换元素pear,可以使用以下函数。

  

来自MDN

     

array.splice(start,deleteCount [,item1 [,item2 [,...]]])

你可以看到你没有删除任何东西,只是在索引i之前添加一个新元素(即在梨之前)。

var arr = ['apples','oranges','pears','grapes'];

for (var i=0; i<arr.length; i++) {
  if (arr[i] == 'pears') {
    arr.splice(i,1,'limes');
 
  }
}

console.log(arr);

答案 2 :(得分:1)

这就是for循环工作的方式:

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

i=0;使用i初始化0;然后,在每次迭代开始时检查此条件i < arr.length,如果它true执行下一次迭代,否则退出循环。在每次迭代结束时i++递增i

由于arr.splice(i,0,'limes')更改数组并在位置i添加元素,因此它会将值pears推送到下一个索引。因此,if (arr[i] == 'pears')始终为true,此条件i < arr.length永远不会为false无尽for ...