for循环中的Array.splice导致错误

时间:2015-02-25 15:34:48

标签: javascript

使用Angular ng-repeat显示$scope.currentMessageList数组

我还有一个删除按钮,通过ng-click绑定到remove功能,如下所示:

remove: function () {
    for (var i = 0; i < 25; i++) {
        var index = i;
        $scope.currentMessageList.splice(index, 1);
        console.log($scope.currentMessageList.length + 'left');
    }
}

当我调用remove函数时,此集合中有25个项目, 我得到了这个输出:

 24left
 23left
 22left
 21left
 20left
 19left
 18left
 17left
 16left
 15left
 14left
 13left
13times X 12left

如果我用angular.forEach替换for循环 我只剩下“12左”,仍然不会删除超过13个项目

我也试过使用angular.apply,而不是我已经进行了摘要错误

5 个答案:

答案 0 :(得分:0)

您在行走阵列时移除物品。

当你到达阵列的一半时,你已经删除了一半的物品,所以你不会删除任何其他物品。

您可以通过始终删除第一个项目或从24向后迭代来解决此问题。

答案 1 :(得分:0)

在循环中删除数组项时,索引也会被移位。结果,您只能迭代其中的一半。这就是问题所在。

如果要清除25个第一项,可以使用Array.prototype.shift方法删除它们。在这种情况下,它将删除数组的第一个元素25次,给出预期的结果:

remove: function () {
    for (var i = 0; i < 25; i++) {
        currentMessageList.shift();
    }
}

答案 2 :(得分:0)

在迭代数组时执行splice是一个坏主意。

你应该替换

            for( var i = 0; i < 25; i++ ){
                var index = i;

                $scope.currentMessageList.splice( index, 1 );
                console.log($scope.currentMessageList.length + 'left');                     
            }

简单

$scope.currentMessageList.splice( 0, 25 );

答案 3 :(得分:0)

您无需遍历数组即可删除所有项目。就这样做:

remove : function(){
                $scope.currentMessageList = [];                 
        }

也可以查看this answer。还有其他方法可以实现这一点,也是有效的。

答案 4 :(得分:0)

拼接数组时...数组的长度会发生变化。 当您尝试删除索引13处的元素时,长度仅为12。 因此它没有被删除。 而不是拼接,尝试shift();