angularjs forEach et splice

j'ai un tableau comme ceci:

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

donc, je veux supprimer les e-mails vides mais angular forEach méthode enlever un seul objet qui est le dernier objet pourquoi???.

code js

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

     } 

    });

où j'ai fais de mal

js Bin

17
demandé sur chandu 2014-06-13 14:15:32

6 réponses

le problème est que vous retirez des éléments du tableau pendant la boucle de sorte que les éléments plus tard sont à des indices différents. Vous avez besoin de la boucle vers l'arrière à la place:

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

Voici un exemple mis à jour.

48
répondu James Allardice 2014-06-13 10:19:17

Comme d'autres l'ont souligné, le coupable du code est le tableau est supprimé. Pour contourner angulaire.forEach, vous pouvez essayer de l'additif/approche d'affectation:

var filteredEmails = [];
angular.forEach($scope.emails, function(email, index){
    if(email.value !==""){
        filteredEmails.push(email);
    }
});

$scope.emails = filteredEmails;
2
répondu Tianzhen Lin 2017-01-15 01:01:00

indexOf retourne -1 quand il ne trouve pas un article.

une façon de supprimer un article, et d'éviter d'enlever le dernier lorsqu'il n'est pas trouvé, est:

var index = $scope.items.indexOf($scope.oldItem);

if (index != -1) {
  $scope.items.splice(index, 1);
}
2
répondu Muhammad Azam 2017-09-19 18:41:38
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);
      }
    });
  }
});
1
répondu Tek 2014-06-13 11:24:57

Je n'ai pas essayé avec AngularJs, mais avec AngularJS 4 une façon similaire de cela fonctionne assez bien.

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

});

Angulaire 4 version:

this.emailArray.forEach(email => {
  if (email.value == "") {
    this.emailArray.splice(this.emailArray.indexOf(email),1);
  }
});
0
répondu Tony Alcast 2018-03-16 14:54:04

Selon docs, la fonction iterator permet un troisième paramètre qui est la collection qui est itérée. Épiler cette collection au lieu de $scope.emails supprimera l'obejct attendu.

angular.forEach($scope.emails, function(email, index, obj){
    if(email.value ===""){
        obj.splice(index, 1);
    } 
});
-1
répondu Helio Santos 2017-01-15 00:02:59