angularjs forEach and splice

后端 未结 6 1188
梦如初夏
梦如初夏 2021-02-01 18:23

I have an array like this:

$scope.emails = [
  {\"key\":\"Work\",\"value\":\"user@domine.com\"},
  {\"key\":\"\",\"value\":\"\"},
   {\"key\":\"Work\",\"value\":         


        
相关标签:
6条回答
  • 2021-02-01 18:54

    indexOf returns -1 when it doesn't find an item.

    A way to remove an item, and to avoid removing the last one when not found, is:

    var index = $scope.items.indexOf($scope.oldItem);
    
    if (index != -1) {
      $scope.items.splice(index, 1);
    }
    
    0 讨论(0)
  • 2021-02-01 18:58

    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.

    0 讨论(0)
  • 2021-02-01 19:04

    According to the docs, the iterator function allows a third parameter which is the collection which is being iterated. Splicing that collection instead of $scope.emails will remove the expected obejct.

    angular.forEach($scope.emails, function(email, index, obj){
        if(email.value ===""){
            obj.splice(index, 1);
        } 
    });
    
    0 讨论(0)
  • 2021-02-01 19:07

    Like others have pointed out, the culprit of the code is the array got removed. To get around with angular.forEach, you can try the additive/assignment approach:

    var filteredEmails = [];
    angular.forEach($scope.emails, function(email, index){
        if(email.value !==""){
            filteredEmails.push(email);
        }
    });
    
    $scope.emails = filteredEmails;
    
    0 讨论(0)
  • 2021-02-01 19:07

    I haven't tried this with AngularJs, but with Angular 4 a similar way of this works pretty well.

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

    Angular 4 version:

    this.emailArray.forEach(email => {
      if (email.value == "") {
        this.emailArray.splice(this.emailArray.indexOf(email),1);
      }
    });
    
    0 讨论(0)
  • 2021-02-01 19:10
    describe('Foreach Splice', function () {
      it('splicing', function () {
    
        var elements = [
          {name: "Kelly", age: 16},
          {name: "", age: 17},
          {name: "Becky", age: 18},
          {name: "", age: 18},
          {name: "Sarah", age: 19},
          {name: "", age: 20},
          {name: "", age: 22},
          {name: "Mareck", age: 21},
          {name: "", age: 21},
          {name: "Mareck", age: 21}
        ];
    
        removeEmptyEntry(elements);
        console.log(elements);
      });
    
    
      function removeEmptyEntry(elements) {
        elements.forEach(function (element, index) {
          if (!element.name) {
            elements.splice(index, 1);
            removeEmptyEntry(elements);
          }
        });
      }
    });
    
    0 讨论(0)
提交回复
热议问题