web-dev-qa-db-ja.com

AngleJS forEachおよびスプライス

私はこのような配列を持っています:

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

だから、空のメールを削除したいのですが、angular forEachメソッドは、最後のオブジェクトである1つのオブジェクトのみを削除する理由はなぜですか????。

jsコード

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

     } 

    });

私が間違っているところ

JS Bin

19
chandu

問題は、ループ中に配列から要素を削除して、後の項目が異なるインデックスにあることです。代わりに逆方向にループする必要があります。

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

更新された例 です。

54
James Allardice

他の人が指摘したように、コードの犯人は配列が削除されたことです。 angular.forEachを回避するには、加算/割り当てのアプローチを試すことができます。

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

$scope.emails = filteredEmails;
3
Tianzhen Lin

indexOfは、アイテムが見つからないときに-1を返します。

アイテムを削除し、見つからない場合に最後のアイテムが削除されないようにする方法は次のとおりです。

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

if (index != -1) {
  $scope.items.splice(index, 1);
}
2
Muhammad Azam
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
Tek

私はAngularJsでこれを試したことはありませんが、Angular 4でこれと同様の方法でかなりうまくいきます。

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

});

Angular 4バージョン:

this.emailArray.forEach(email => {
  if (email.value == "") {
    this.emailArray.splice(this.emailArray.indexOf(email),1);
  }
});
0
Tony Alcast