es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obtener un valor por frecuencia en un hash de JavaScript sin perder las otras claves y valores.

Estoy aprendiendo Javascript y tengo un hash de usuarios como este:

const users = [{id: 1, firstName: "Jose", revenue: 3700, country: "Colombia"}, {id: 2, firstName: "Rodney", revenue: 9100, country: "Germany"}, {id: 3, firstName: "Danny", revenue: 0, country: "United States"}, { id: 4, firstName: "Birgit", revenue: 7700, country: "Germany"}, {id: 5, firstName: "Audra", revenue: 0, country: "Germany"}, {id: 6, firstName: "Doreatha", revenue: 0, country: "Colombia"}];

y me gustaría obtener las frecuencias de una clave (country) así como la suma de otra clave (revenue) de los dos países más frecuentes. Intenté usar .reduce para obtener los países, pero el problema es que devuelve un objeto sin ingresos. Aquí está mi código:

const usersByCountry = users.reduce((c, u) => {
  c[u.country] = c[u.country] + 1 || 1;
  return c;
}, {});

Y aquí está el resultado:

Object { "Colombia": 2, "Germany": 3, "United States": 1 }

¿Es posible utilizar .reduce para esto o estoy en el camino equivocado?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible usar .reduce para obtener las frecuencias de una clave (país) y la suma de otra clave (ingresos) de los dos países más frecuentes. Aquí hay un ejemplo de código que hace eso:

    const result = Object.entries(users.reduce((acc, user) => {
        if (!acc[user.country]) {
            acc[user.country] = { count: 1, revenue: user.revenue };
        } else {
            acc[user.country].count++;
            acc[user.country].revenue += user.revenue;
        }
       return acc;
    }, {}))
    .sort((a, b) => b[1].count - a[1].count)
    .slice(0, 2)
    .reduce((acc, [country, {count, revenue}]) => {
        acc.totalRevenue += revenue;
        acc[country] = { count, revenue };
        return acc;
    }, { totalRevenue: 0 });
    
    console.log(result);
    

    La salida del código anterior es:

    {
      "totalRevenue": 14500,
      "Germany": {
        "count": 3,
        "revenue": 16800
      },
      "Colombia": {
        "count": 2,
        "revenue": 3700
      }
    }
    

    Explicación:

    Primero, el arreglo de usuarios se reduce a un objeto con las claves como los nombres de los países y los valores como objetos que contienen el conteo y los ingresos de cada país. Si el país aún no existe en el objeto, se inicializa con un conteo de 1 y los ingresos iguales a los ingresos del usuario. De lo contrario, se incrementa el conteo y se agrega los ingresos del usuario a los ingresos existentes.

    Luego, el objeto se convierte en un arreglo de pares [país, valores] usando Object.entries, se ordena por conteo en orden descendente y se toma solo los primeros dos países.

    Finalmente, el arreglo de dos pares [país, valores] se reduce a un nuevo objeto con el total de ingresos y los pares [país, {conteo, ingresos}] de los dos países más frecuentes.

Comments are closed.