Tengo el siguiente código:
const config = { key1: { outlier: 'outlier1' }, key2: { test: 'test' }, key3: { outlier: 'outlier3' } } const finalArr = []; Object.keys(config).forEach((key) => { const obj = config[key]; // How to make this if/if/else structure cleaner? if (obj.outlier) { if (doSomeWithOutlier(obj.outlier)) { finalArr.push(obj); } }else { finalArr.push(obj); } });¿Hay una forma más limpia de hacer lo anterior? Parece que estoy anidando los estambres if/if y las declaraciones else demasiado y duplicando el código finalArr.push(obj).
Podrías usar:
if ((obj.outlier && doSomeWithOutlier(obj.outlier)) || !obj.outlier) { finalArr.push(obj); }Sin embargo, creo que su estructura es más fácil de leer.
También puede recorrer Object.values(config) en lugar de las claves, por lo que no necesita el paso adicional de const obj = config[key]; .
Alternativa:
if (obj.outlier && !doSomeWithOutlier(obj.outlier)) return; finalArr.push(obj);Los otros le mostraron cómo manejar if/if/else como una sola condición para acortar el código, usando Object.values() y .reduce ayudaría a acortar aún más el código:
const finalArr = Object.values(config).reduce((arr, el) => el.outlier && doSomeWithOutlier(el.outlier) ? [...arr, el] : arr, []);Si desea realizar alguna operación en caso de que .outlier no esté presente, simplemente cambie la última declaración del operador ternario.