let inputArr = [{ "gender": "MALE", "name": "A", "age": 20 }, { "gender": "MALE", "name": "B", "age": 12 }, { "gender": "FEMALE", "name": "C", "age": 16 }, { "gender": "MALE", "name": "D", "age": 21 }, { "gender": "FEMALE", "name": "E", "age": 30 } ] console.log(JSON.stringify(inputArr.reduce((acc, ele) => { if (acc[ele["gender"]]) { acc[ele.gender].members.push(ele); } else { acc[ele["gender"]] = { members: [] } } return acc; }, {}))) Estoy tratando de agrupar a los usuarios en función del género, usando Array.reduce pero el resultado no muestra todos los registros que están incluidos en la matriz, no puedo entender el problema aquí
Su reductor no empuja el elemento cuando encuentra un género por primera vez, por lo que falta el primer usuario de cada género en su resultado
let inputArr = [{"gender": "MALE","name": "A","age": 20},{"gender": "MALE","name": "B","age": 12},{"gender": "FEMALE","name": "C","age": 16},{"gender": "MALE","name": "D","age": 21},{"gender": "FEMALE","name": "E","age": 30}] console.log(JSON.stringify(inputArr.reduce((acc, ele) => { if (acc[ele["gender"]]) { acc[ele.gender].members.push(ele); } else { acc[ele["gender"]] = { members: [ele] // initialise the array with the current user } } return acc; }, {})))Otra solución, pero no la recomiendo si el rendimiento importa.
let inputArr = [{ "gender": "MALE", "name": "A", "age": 20 }, { "gender": "MALE", "name": "B", "age": 12 }, { "gender": "FEMALE", "name": "C", "age": 16 }, { "gender": "MALE", "name": "D", "age": 21 }, { "gender": "FEMALE", "name": "E", "age": 30 } ] function groupBy(array, field) { return array.reduce((acc, item) => ({ ...acc, [item[field]]: [...acc[item[field]] || [], item] }), {}) } console.log(groupBy(inputArr, "gender"))