6
回答
js数组map方法中使用splice方法的一个问题
var arr = [1, 2, 3, 4, 5, 6];
arr.map(function (v, k) {
    console.log(v);
    arr.splice(k, 1);
});
console.log(arr);

按照理解, 应该是每个元素都被删除, 但是结果确实每隔1个被删除

请教一下各位大大, 造成这样的结果原因是什么?


最后我的解决方式是

var arr = [1, 2, 3, 4, 5, 6];
var removeArr = [];
arr.map(function (v, k) {
    removeArr.push(k);
});
removeArr.map(function (v) {
    arr.splice(v, 1);
});
有没有更好的解决方法呢?


问题总汇:

1.造成隔位删除的原因是什么

2.有没有更好的解决方法

ps: 谢谢

举报
jacky-zhuo
发帖于5年前 6回/6K+阅
共有6个答案 最后回答: 5年前

那也不是你这样用的,如果你用的是ECMAScript 5中标准的map方法,你要理解map是干什么用的。map是利用传入的回调生成一个新的数组。

你这种情况直接使用如下方式就可以:

var arr = [1,2,3,4,5,6];
//以下3个例子都是删除数组中不是偶数的数

//方法一、使用ECMAScript 5中定义的方法filter(如果已经兼容了浏览器,建议)
arr = arr.filter(function(v, i){
   return v%2===0; //只保留原数组中的偶数
});

//方法二、使用jQuery的grep工具方法(建议)
arr = $.grep(arr, function(v, i){
    return v%2===0; //只保留原数组中的偶数
});

//方法三、使用jQuery的map工具方法(不建议)
arr = $.map(arr, function(v, i){
    return v%2===0 ? v : null; //返回null的项目将被删除
});

--- 共有 2 条评论 ---
JonyZhang回复 @Mr.zHuo : 如果在需要考虑性能的情况当然是for好,否则就是工具方法好了。包括Array.prototype.forEach、Array.prototype.map、$.each、$.map都是可以的。 5年前 回复
jacky-zhuo遍历一个数组, 不进行散除, 是用for循环好还是使用数组的什么方法比较好呢 5年前 回复

splice后会重建数组索引,你删了1个,后面的元素下标都减1,往前靠拢。

把你的console.log(v)改成console.log(arr,k,v)看看效果。

--- 共有 1 条评论 ---
jacky-zhuo有没有什么更加好的办法解决这个问题 5年前 回复
如果你是要清空数组,建议使用 arr.length = 0; 这是最好的方式
--- 共有 1 条评论 ---
jacky-zhuo不是要清空数组, 是删除特定条件的元素, 这个问题是最后简化了的 5年前 回复
合理的解决方案是用引入另一个数组,在对原有数组进行迭代时,禁止删除或者增加原有数组元素,而要对符合条件的数组元素push到另一个目标数组,然后将目标数组输出。
顶部