[英]Mutated Array in AngularJS Filter
我有一个包含一些条件的自定义AngularJS过滤器。 在我的else
条件下,我将值从数组中拼接出来并返回该数组。
这是我的问题:在else
条件中将值拼接出数组会改变该数组,如果之后调用if
条件,它将不再处理原始的完整数组和原始数组,而仅处理包含剩余索引的部分数组拼接。
我该如何纠正这个问题,以确保每次运行过滤器时都在处理完整的数据集? 我尝试在else
块中使用数组的副本(使用var newArr = items.splice(0)
),但是无论出于何种原因,问题仍然存在。
一种选择是在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;
};
})
从给定数组中删除元素是一种变异操作。
另一种方法是实现非变异元素去除。 代替直接修改输入数组,下面的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"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.