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)
),它会返回已删除的项而不实际修改数组本身(数组保持完全相同)。
答案 0 :(得分:3)
arr.splice(i,0,'limes');
会在
您可以通过添加
轻松查看此内容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
...