Tengo una aplicación Vue que obtiene un objeto JSON como el siguiente. Necesito contar la cantidad de elementos donde _Valid es verdadero. Tengo muy poca experiencia con el método Reduce en Javascript y no sé cómo filtrar una parte del nombre de una clave. ¿Dónde empiezo? es posible?
{ "F_Mountain1_Week": "1", "F_Mountain1_Date": "2021-11-12", "F_Mountain1_Valid": true, "F_Mountain2_Week": "1", "F_Mountain2_Date": "2021-11-12", "F_Mountain2_Valid": true, "F_Mountain3_Week": "1", "F_Mountain3_Date": "2021-11-12", "F_Mountain3_Valid": true, "F_Mountain4_Week": "", "F_Mountain4_Date": "2021-11-12", "F_Mountain4_Valid": false, "F_Mountain5_Week": "", "F_Mountain5_Date": "2021-11-12", "F_Mountain5_Valid": false, "F_Mountain6_Week": "", "F_Mountain6_Date": "2021-11-12", "F_Mountain6_Valid": false, "F_Mountain7_Week": "", "F_Mountain7_Date": "2021-11-12", "F_Mountain7_Valid": false, "F_Mountain8_Week": "", "F_Mountain8_Date": "2021-11-12", "F_Mountain8_Valid": false, }Esto también funcionaría
Uso entries y filter . Primero, obtenga los pares de clave y valor y luego filtre usando la condición basada en el value y las propiedades key .
let data = { F_Mountain1_Week: "1", F_Mountain1_Date: "2021-11-12", F_Mountain1_Valid: true, F_Mountain2_Week: "1", F_Mountain2_Date: "2021-11-12", F_Mountain2_Valid: true, F_Mountain3_Week: "1", F_Mountain3_Date: "2021-11-12", F_Mountain3_Valid: true, F_Mountain4_Week: "", F_Mountain4_Date: "2021-11-12", F_Mountain4_Valid: false, F_Mountain5_Week: "", F_Mountain5_Date: "2021-11-12", F_Mountain5_Valid: false, F_Mountain6_Week: "", F_Mountain6_Date: "2021-11-12", F_Mountain6_Valid: false, F_Mountain7_Week: "", F_Mountain7_Date: "2021-11-12", F_Mountain7_Valid: false, F_Mountain8_Week: "", F_Mountain8_Date: "2021-11-12", F_Mountain8_Valid: false }; console.log( Object.entries(data).filter(([key, value]) => key.endsWith("_Valid") && value) .length );Simplemente puede recorrer la matriz usando reduce y calcular la cantidad de propiedades que termina _Valid endsWith que es true como:
Object.keys(obj).reduce((acc, curr) => curr.endsWith("_Valid") && obj[curr] ? acc + 1 : acc, 0)o también puede usar el filtro aquí como:
Object.keys(obj).filter((k) => k.endsWith("_Valid") && obj[k]).length; const obj = { F_Mountain1_Week: "1", F_Mountain1_Date: "2021-11-12", F_Mountain1_Valid: true, F_Mountain2_Week: "1", F_Mountain2_Date: "2021-11-12", F_Mountain2_Valid: true, F_Mountain3_Week: "1", F_Mountain3_Date: "2021-11-12", F_Mountain3_Valid: true, F_Mountain4_Week: "", F_Mountain4_Date: "2021-11-12", F_Mountain4_Valid: false, F_Mountain5_Week: "", F_Mountain5_Date: "2021-11-12", F_Mountain5_Valid: false, F_Mountain6_Week: "", F_Mountain6_Date: "2021-11-12", F_Mountain6_Valid: false, F_Mountain7_Week: "", F_Mountain7_Date: "2021-11-12", F_Mountain7_Valid: false, F_Mountain8_Week: "", F_Mountain8_Date: "2021-11-12", F_Mountain8_Valid: false, }; const result = Object.keys(obj).reduce((acc, curr) => curr.endsWith("_Valid") && obj[curr] ? acc + 1 : acc, 0); console.log(result); let data = { F_Mountain1_Week: "1", F_Mountain1_Date: "2021-11-12", F_Mountain1_Valid: true, F_Mountain2_Week: "1", F_Mountain2_Date: "2021-11-12", F_Mountain2_Valid: true, F_Mountain3_Week: "1", F_Mountain3_Date: "2021-11-12", F_Mountain3_Valid: true, F_Mountain4_Week: "", F_Mountain4_Date: "2021-11-12", F_Mountain4_Valid: false, F_Mountain5_Week: "", F_Mountain5_Date: "2021-11-12", F_Mountain5_Valid: false, F_Mountain6_Week: "", F_Mountain6_Date: "2021-11-12", F_Mountain6_Valid: false, F_Mountain7_Week: "", F_Mountain7_Date: "2021-11-12", F_Mountain7_Valid: false, F_Mountain8_Week: "", F_Mountain8_Date: "2021-11-12", F_Mountain8_Valid: false }; for (var prop in data) { if (typeof data[prop] == 'function') continue; if(/_Valid$/.test(prop) && data[prop] === true) { console.log('BAZINGA!') } else { console.log('I DON\'T CARE ABOUT THIS PROP:\n') console.log(`Property name: ${prop} - Value: ${data[prop]}`); } }