ES6-根据条件从数组中删除对象并返回数组的其余部分



有三个标志xstatus、ystatus和zstatus,用于确定具有属性name.is_xstatus和name.is_ystatus的对象是否应存在于数组中。

//All flags are true
var xstatus = true;
var ystatus = true;
var zstatus = true;
var myArray = [
{field: 'id', name:'is_xstatus', operator: 'eq', value: 'id'}, 
{field: 'cStatus', name:'is_ystatus', operator: 'eq', value: 'cStatus'}, 
{field: 'money', name:'is_zstatus', operator: 'eq', value: 'money'},
{field: 'coverage', name:'is_coverage', operator: 'eq', value: 'coverage'},
{field: 'nam', name:'is_nam', operator: 'eq', value: 'nam'}    
];

var xstatus = true;
var ystatus = true;
var zstatus = true;
var myArray = [
{field: 'id', name:'is_xstatus', operator: 'eq', value: 'id'}, 
{field: 'cStatus', name:'is_ystatus', operator: 'eq', value: 'cStatus'}, 
{field: 'money', name:'is_zstatus', operator: 'eq', value: 'money'},
{field: 'coverage', name:'is_coverage', operator: 'eq', value: 'coverage'},
{field: 'nam', name:'is_nam', operator: 'eq', value: 'nam'}

];
myArray = myArray.filter(( obj ) =>(!zstatus && obj.name !== 'is_zstatus')).filter((obj) => (!ystatus && obj.name !== 'is_ystatus'))
console.log(myArray);

我尝试了上面的过滤方法。如果不满足筛选条件,则返回空[]。但我需要的是,如果条件不满足,则返回不删除任何对象的数组

var xstatus = true;
var ystatus = true;
var zstatus = false;
var myArray = [
{field: 'id', name:'is_xstatus', operator: 'eq', value: 'id'}, 
{field: 'cStatus', name:'is_ystatus', operator: 'eq', value: 'cStatus'}, 
{field: 'money', name:'is_zstatus', operator: 'eq', value: 'money'},
{field: 'coverage', name:'is_coverage', operator: 'eq', value: 'coverage'},
{field: 'nam', name:'is_nam', operator: 'eq', value: 'nam'}
];

myArray.forEach((obj, index) => {
if(!zstatus && obj.name == 'is_zstatus') {
delete myArray[index];
}
return myArray;
});
console.log(myArray);

使用排列运算符的另一种方法

var xstatus = false;
var ystatus = true;
var zstatus = true;
var myArray = [
{field: 'id', name:'is_xstatus', operator: 'eq', value: 'id'}, 
{field: 'cStatus', name:'is_ystatus', operator: 'eq', value: 'cStatus'}, 
{field: 'money', name:'is_zstatus', operator: 'eq', value: 'money'},
{field: 'coverage', name:'is_coverage', operator: 'eq', value: 'coverage'},
{field: 'nam', name:'is_nam', operator: 'eq', value: 'nam'}

];
let arr1 = myArray.filter(( obj ) =>(zstatus && obj.name == 'is_zstatus'));
let arr2 = myArray.filter(( obj ) =>(xstatus && obj.name == 'is_xstatus'));
let arr3 = myArray.filter(( obj ) =>(ystatus && obj.name == 'is_ystatus'));
let remainingElements = myArray.filter((obj) => (obj.name !== 'is_ystatus' && obj.name !== 'is_xstatus' && obj.name !== 'is_zstatus'));
myArray = [ ...arr1, ...arr2, ...arr3, ...remainingElements];
console.log(myArray);

您不能使用链接调用来进行筛选。zstatus过滤器将删除具有is_xtatusis_ystatus的所有元素,因此它们不可用于这些过滤器。

相反,使用对filter()的单个调用来测试使用||的所有条件。

var xstatus = true;
var ystatus = true;
var zstatus = true;
var myArray = [
{field: 'id', name:'is_xstatus', operator: 'eq', value: 'id'}, 
{field: 'cStatus', name:'is_ystatus', operator: 'eq', value: 'cStatus'}, 
{field: 'money', name:'is_zstatus', operator: 'eq', value: 'money'},
{field: 'coverage', name:'is_coverage', operator: 'eq', value: 'coverage'},
{field: 'nam', name:'is_nam', operator: 'eq', value: 'nam'}
];
myArray = myArray.filter((obj) =>
(zstatus && obj.name == 'is_zstatus') ||
(ystatus && obj.name == 'is_ystatus') ||
(xstatus && obj.name == 'is_xtatus') ||
(obj.name !== 'is_ystatus' && obj.name !== 'is_xstatus' && obj.name !== 'is_zstatus'));
console.log(myArray);

为什么不在筛选后添加判断?

let temp = myArray.filter(( obj ) =>(!zstatus && obj.name !== 'is_zstatus')).filter((obj) => (!ystatus && obj.name !== 'is_ystatus'));
myArray = temp.length ? temp : myArray;

最新更新