splice如何在angularjs / javascript中完全正常工作?

时间:2016-05-24 18:41:19

标签: javascript angularjs

我有一个对象数组: -

$scope.obj=[{"id":1,"content_type_name":"collections"},{"id":2,"content_type_name":"collections"},{"id":3,"content_type_name":"random"}];

现在,当我尝试运行angularForEach循环时,只有第一个集合条目(即id = 1的一个被删除,但id = 2的那个条目仍然存在)。理想情况下,预期输出应该只是id = 3的对象。以下是代码: -

angular.forEach($scope.obj, function(content, index){
       if(content.content_type_name == "collections"){
           $scope.obj.splice(index,1);
       }
});

然而,当我运行它时,它完全正常: -

for(var i=$scope.obj.length-1;i>=0;--i){
        if($scope.obj[i].content_type_name == "collections"){
            $scope.obj.splice(i,1);
        }
  }

我没有清楚地了解为什么拼接不起作用。

请帮忙吗?

2 个答案:

答案 0 :(得分:1)

因此,角度forEach循环从数组的开头开始,而带有for循环的第二个示例在结束时开始并返回。由于您在找到“collections”作为content_type_name时删除了一个元素,因此会将数组中每个其他项的索引向下移1。

在Angular forEach循环中,它从索引0开始,将其删除,然后转到索引1,这是数组中的最后一个元素,因为刚删除了一个。基本上它正在跳过第二个元素。

你的第二个例子,使用for循环,没有这个问题,因为它向后移动通过数组。因此,它检查索引2,不执行任何操作,检查索引1,将其删除,然后转到索引0,它也会删除。希望我说得这么好......

答案 1 :(得分:0)

也许您正在寻找过滤器

$scope.obj = $scope.obj.filter(function(e){
   return e.content_type_name == "collections"
});

然后你不必删除每一个元素