Dada una matriz de objetos JSON de muestra, como esta....
[ { "firstName": "Bob", "lastName": "Smith", "city": "Preston", "st": "Florida", "age": 15 }, { "firstName": "Tom", "lastName": "Jones", "city": "Springfield", "st": "Illinois", "age": 34 }, { "firstName": "Mary", "lastName": "Hart", "city": "Miami", "st": "Florida", "age": 22 }, { "firstName": "Jenny", "lastName": "Dixon", "city": "Palm City", "st": "Florida", "age": 26 } ]¿Cuál es la mejor manera de obtener el número de ocurrencias en función de las agrupaciones de una propiedad en particular? Entonces, digamos que quiero producir un objeto JSON que tenga cada estado único ("st") y el número de ocurrencias...
[ { "st": "Illinois", "count": 1 }, { "st": "Florida", "count": 3 } ]Puedo hacerlo manualmente usando un for-let, recorriendo la matriz, rastreando los valores mientras recorro, etc. Pero estoy seguro de que hay una manera más eficiente usando ES6. ¿Puedes ayudarme? Gracias.
Puede usar Array#reduce para llevar la cuenta
let counts = json.reduce((b, a) => { let index = b.findIndex(j => j.st === a.st); if (index > -1) b[index].count++; else b.push({st: a.st, count: 1}); return b; }, []) #ACTUALIZAR: Como mencionó @epascarello, hay una manera más eficiente de hacer esto, eliminando el bucle findIndex y usando Object.values
const results = Object.values(json.reduce((obj, item) => { obj[item.st] = obj[item.st] || { st: item.st, count: 0 }; obj[item.st].count++; return obj;}, {})) let json = [{ "firstName": "Bob", "lastName": "Smith", "city": "Preston", "st": "Florida", "age": 15 }, { "firstName": "Tom", "lastName": "Jones", "city": "Springfield", "st": "Illinois", "age": 34 }, { "firstName": "Mary", "lastName": "Hart", "city": "Miami", "st": "Florida", "age": 22 }, { "firstName": "Jenny", "lastName": "Dixon", "city": "Palm City", "st": "Florida", "age": 26 } ] let counts = json.reduce((b, a) => { let index = b.findIndex(j => j.st === a.st); if (index > -1) b[index].count++; else b.push({st: a.st, count: 1}); return b; }, []) console.log(counts) const results = Object.values(json.reduce((obj, item) => { obj[item.st] = obj[item.st] || { st: item.st, count: 0 }; obj[item.st].count++; return obj;}, {})) console.log(results)