Tengo el código actual (snippet) pero quiero contar el total de las respuestas
Ejemplo:
"2022-01-03": { "yes": 1, "no": 2, "total": 3 } const array = [ { date: '2022-01-03', answer: 'yes' }, { date: '2022-01-03', answer: 'no' }, { date: '2022-01-03', answer: 'no' }, { date: '2022-01-04', answer: 'yes' }, { date: '2022-01-04', answer: 'yes' }, { date: '2022-01-05', answer: 'yes' }, { date: '2022-01-05', answer: 'yes' }, { date: '2022-01-05', answer: 'yes' }, { date: '2022-01-05', answer: 'no' }, ] const result = array.reduce((acc, curr) => { if (!acc[curr.date]) { acc[curr.date] = { yes: 0, no: 0 } } acc[curr.date][curr.answer]++; return acc; }, {}); console.log(result)¿Cuál es la forma correcta de hacerlo?
Puede agregar un campo total e incrementar para cada valor:
const array = [ { date: '2022-01-03', answer: 'yes' }, { date: '2022-01-03', answer: 'no' }, { date: '2022-01-03', answer: 'no' }, { date: '2022-01-04', answer: 'yes' }, { date: '2022-01-04', answer: 'yes' }, { date: '2022-01-05', answer: 'yes' }, { date: '2022-01-05', answer: 'yes' }, { date: '2022-01-05', answer: 'yes' }, { date: '2022-01-05', answer: 'no' }, ] const result = array.reduce((acc, curr) => { if (!acc[curr.date]) { acc[curr.date] = { yes: 0, no: 0, total: 0 } } acc[curr.date][curr.answer]++; acc[curr.date].total++; return acc; }, {}); console.log(result) .as-console-wrapper { max-height: 100% !important; }Cree un campo captador para el total , de modo que se calcule automáticamente:
const array = [ { date: '2022-01-03', answer: 'yes' }, { date: '2022-01-03', answer: 'no' }, { date: '2022-01-03', answer: 'no' }, { date: '2022-01-04', answer: 'yes' }, { date: '2022-01-04', answer: 'yes' }, { date: '2022-01-05', answer: 'yes' }, { date: '2022-01-05', answer: 'yes' }, { date: '2022-01-05', answer: 'yes' }, { date: '2022-01-05', answer: 'no' }, ] const result = array.reduce((acc, curr) => { if (!acc[curr.date]) { acc[curr.date] = { yes: 0, no: 0, get total() { return this.yes + this.no; } } } acc[curr.date][curr.answer]++; return acc; }, {}); console.log(result)No vi ningún problema en su código, pero acorté una línea y se optimizó más.
De:
const result = array.reduce((acc, curr) => { if (!acc[curr.date]) { acc[curr.date] = { yes: 0, no: 0 } } acc[curr.date][curr.answer]++; return acc; }, {});a
const result = array.reduce((acc, curr) => { acc[curr.date] ||= { yes: 0, no: 0, total: 0 }; acc[curr.date][curr.answer]++; acc[curr.date][total]++ return acc; }, {});