Hay tres indicadores xstatus, ystatus y zstatus que determinan si el objeto con las propiedades name.is_xstatus, name.is_ystatus y name.is_zstatus debe estar presente en la matriz o no.
//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);Intenté lo anterior con el método de filtro. Cuando las condiciones del filtro no se cumplen, devuelve vacío []. Pero lo que necesito es que si no se cumplen las condiciones, devuelva el Array sin eliminar ningún objeto.
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);No puede hacer esto con llamadas encadenadas para filtrar. El filtro zstatus eliminará todos los elementos con is_xtatus e is_ystatus , por lo que no estarán disponibles para esos filtros.
En su lugar, use una sola llamada a filter() que pruebe todas las condiciones usando || .
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);Otro enfoque con el uso del operador de propagación
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);¿Por qué no agregar un juicio después del filtro?
let temp = myArray.filter(( obj ) =>(!zstatus && obj.name !== 'is_zstatus')).filter((obj) => (!ystatus && obj.name !== 'is_ystatus')); myArray = temp.length ? temp : myArray;