filter和splice 小坑记录
let arr = [1, 2, 3, 4];
arr.forEach(el => {
console.log(el);
if (el === 2) {
arr.splice(el, 1); // remove element 2
}
});
//output: 1 2 4
let arr = [1,2,3,4];
arr.forEach(el => {
console.log(el);
if (el === 2) {
arr = arr.filter(el => el !== 2); // remove element 2
}
});
//output: 1 2 3 4
原因:
splice方法改变了数组内存中的数据,把数组的第三个元素给删除了,遍历的元素自然少了一个。
而filter方法返回的是一个新的数组,并改变了arr变量的指向。可是,原来arr指向的原数组内存尚未回收,forEach方法遍历的是原来arr指向的那个数组,forEach的那份引用并没有发生改变。
注意,
用splice删除数组元素,通常搭配indexof方法
如果indexof返回 ( -1),即未找到该元素,则 splice将删除数组的最后一个元素(负索引有效)。
let arr=[1,2,3,4]
arr.splice(arr.indexOf(5), 1);
console.log(arr)
// output: 1 2 3