angularjs forEach and splice

chandu picture chandu · Jun 13, 2014 · Viewed 56.6k times · Source

I have an array like this:

$scope.emails = [
  {"key":"Work","value":"[email protected]"},
  {"key":"","value":""},
   {"key":"Work","value":"[email protected]"}
  {"key":"","value":""}];

So, I want to remove empty emails but angular forEach method removing only one object that is last object why???.

js code

angular.forEach($scope.emails, function(email, index){
     if(email.value ===""){
       $scope.emails.splice(index, 1);

     } 

    });

where I am doing wrong

JS Bin

Answer

James Allardice picture James Allardice · Jun 13, 2014

The problem is that you remove elements from the array during the loop so later items are at different indices. You need to loop backwards instead:

for (var i = $scope.emails.length - 1; i >= 0; i--) {
    if (!$scope.emails[i].value) {
        $scope.emails.splice(i, 1);
    }
}

Here's an updated example.