2017-08-20 13 views
0

私はこのカスタムAngularJSフィルターにいくつかの条件が含まれています。私のelse状態では、私は配列から値をスプライシングして、その配列を返しています。ここでAngularJSフィルターの突然変異アレイ

は私の問題です:else状態で配列のうちスプライシング値は、配列を変異させるません、とif条件がその後呼び出された場合、それはもはや、元の完全な自然のままの配列を処理し、残りを含む部分的にしか配列それがスプライスされた後のインデックス

フィルタが実行されるたびにのデータセットが処理されていることを確認するにはどうすればよいですか? elseブロックの配列のコピー(var newArr = items.splice(0)を使用)を試してみましたが、何らかの理由で問題が残っています。

1つの選択肢は、else条件で新しい配列を作成し、元の配列を欠損させるのではなく、それを返すことです。しかし、私は複雑な複数のネストされたデータ構造を扱っているので、簡単にするために、値を削除できる解決策を探しています。

angular.module("app", []). 
filter('department', function() { 
    return function(items, args) { 
    var filtered; 
    var output = []; 

    // return all items when 'All Departments' selected    
    if (args.selectedDepartment.Name == 'All Departments' && args.selectedDepartment.Id === undefined) { 
     return items; 
    } 

    // return orders containing products from selected department with 'Inclusive' option 
    if (args.selectedDepartment.Id !== undefined && !args.option) { 
     for (let i = 0; i < items.length; i++) { 
     filtered = items[i].products.filter(function(item) { 
      return item.Order__r.Department__r.Id == args.selectedDepartment.Id; 
     }); 
     if (filtered.length >= 1) { 
      output.push(items[i]); 
     } 
     } 

     // return only products which are an exact match to the selected department with 'Exclusive' option 
    } else if (args.selectedDepartment.Id !== undefined && args.option) { 

     for (let i = 0; i < items.length; i++) { 
     for (let j = 0; j < items[i].products.length; j++) { 
      if (items[i].products[j].Order__r.Department__r.Id != args.selectedDepartment.Id) { 
      items[i].products.splice(j, 1); 
      } 
     } 
     if (items[i].products.length === 0) { 
      items.splice(i, 1); 
     } 
     } 

     return items; 
    } 
    return output; 
    }; 
}) 

答えて

0

特定の配列から要素を削除する操作は、変更操作です。

もう1つのアプローチは、非突然変異要素除去を実装することです。以下のremove関数は、入力配列を直接変更するのではなく、指定した配列以外のすべての要素を含む新しい配列を返すことができます。

function remove(array, element) { 
    return array.filter(e => e !== element); 
} 
const vowelsAndX = ["a", "e", "i", "o", "u", "x"]; 
const vowels = remove(vowelsAndX, "x"); 
vowels.toString(); // "a,e,i,o,u"