私はこのカスタム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;
};
})