数组的map方法会循环数组,在函数里对数组的每一项进行处理,最后返回一个处理后的函数;但是如果我们在函数里对数组本身进行改变的话会怎样呢?
var removeElement = function(nums, val) { nums.map(function (item, index){ if(item === val){ console.log(index); // 2 3 第一次原数组输出val项的index为2,下边splice改变了原数组为[1,2,4,3,5],在执行函数进入判断输出val项的index为3 nums.splice(index, 1); } }); }; removeElement([1,2,3,4,3,5], 3);
通过以上例子可以看出,如果我们在某一次循环改变原数组的话,那么接下来循环的处理是在已经改变的数组的基础上进行的。
var removeElement = function(nums, val) { nums.map(function (item, index){ if(item === val){ nums.splice(index, 1); // 已经删除数组的索引为2的项了,后一个2就变成索引为2的项了,然而已经处理过索引2了,所以2这个索引就没处理,导致有一个2没有删除掉。 } }); }; removeElement([0,1,2,2,3,0,4,2], 2);
以上代码中如果是这样的数组:[0,1,2,2,2,3,0,4,2] ,nums为[0, 1, 2, 3, 0, 4];如果是[0,1,2,2,2,2,3,0,4,2] ,nums为[0, 1, 2, 2, 3, 0, 4]