數組的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]