Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

132
Vistas
Iterando a través de un objeto y actualizando valores basados en valores existentes

Tengo un objeto json data estructurado así:

 data: [{ "aggregate": { "path": "/home/page1", "query": "name=todd" }, "visits": 4, "clicks": 7 },{ "aggregate": { "path": "/home/page1", "query": "name=matt" }, "visits": 5, "clicks": 17 },{ "aggregate": { "path": "/home/page2", "query": "" }, "visits": 4, "clicks": 7 },{ "aggregate": { "path": "/home/page3", "query": "term=dig" }, "visits": 2, "clicks": 20 },{ "aggregate": { "path": "/home/page1", "query": "term=dug" }, "visits": 2, "clicks": 11 }]

Estoy buscando terminar con un objeto aggregatedObject como este:

 [{ "path": "/home/page1", "visits": 9, "clicks": 24 },{ "path": "/home/page2", "visits": 4, "clicks": 7 },{ "path": "/home/page1", "visits": 4, "clicks": 31 }]

Esto es lo que tengo hasta ahora:

 let aggregatedObject = []; _.each(data, function (item) { if (!_.find(aggregatedObject, { path: item.aggregate.path })) { aggregatedObject.push({ path: item.aggregate.path, visits: item.visits, clicks: item.clicks }); //console.log('not found'); } else { // so lost here } });

Lo que estoy tratando de hacer es que si mi nuevo objeto no tiene un elemento que coincida con el elemento que estoy iterando actualmente, lo empujo hacia el nuevo objeto. Hasta ahora puedo hacer esto con éxito.

Sin embargo, si encuentro un elemento que coincide con la ruta en mi nuevo objeto (ignorando la consulta), no tengo idea de cómo actualizar ese elemento con la suma de las visitas y los clics del elemento existente, y el que estoy repitiendo.

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

Puede agrupar según la path y agregar visits y clicks para la misma ruta usando array#reduce .

 const data = [{ "aggregate": { "path": "/home/page1", "query": "name=todd" }, "visits": 4, "clicks": 7 },{ "aggregate": { "path": "/home/page1", "query": "name=matt" }, "visits": 5, "clicks": 17 },{ "aggregate": { "path": "/home/page2", "query": "" }, "visits": 4, "clicks": 7 },{ "aggregate": { "path": "/home/page3", "query": "term=dig" }, "visits": 2, "clicks": 20 },{ "aggregate": { "path": "/home/page1", "query": "term=dug" }, "visits": 2, "clicks": 11 }], result = Object.values(data.reduce((r, o) => { const path = o.aggregate.path; r[path] ??= { path, visits: 0, clicks: 0}; r[path].visits += o.visits; r[path].clicks += o.clicks; return r; },{})); console.log(result);

about 4 years ago · Juan Pablo Isaza Denunciar

0

Creo que desea agrupar datos según la ruta , pero el resultado de su ejemplo no hace eso, tiene dos entradas para "/home/page1" y ninguna para "/home/page3", supondré que es solo un error en el post.

Debe probar para ver si la ruta ya existe y, de lo contrario, agregar un nuevo objeto agregado para ella, luego agregar clics y visitas.

Mirar a través de la matriz agregada cada vez que se busca la ruta puede ser costoso si la matriz se vuelve muy grande, así que considere crear un objeto de índice de la ruta a la matriz de datos agregados para que sean solo dos búsquedas (una para obtener el índice y luego otra para obtener el objeto) en lugar de que buscar a través de la matriz cada vez. Por ejemplo (sin lodash, me temo):

 let data = [{ "aggregate": { "path": "/home/page1", "query": "name=todd" }, "visits": 4, "clicks": 7 },{ "aggregate": { "path": "/home/page1", "query": "name=matt" }, "visits": 5, "clicks": 17 },{ "aggregate": { "path": "/home/page2", "query": "" }, "visits": 4, "clicks": 7 },{ "aggregate": { "path": "/home/page3", "query": "term=dig" }, "visits": 2, "clicks": 20 },{ "aggregate": { "path": "/home/page1", "query": "term=dug" }, "visits": 2, "clicks": 11 }]; // Map of path to index in aggArr {path: index} let pathMap = {}; // Get aggregated array data let aggData = data.reduce((agg, obj) => { let path = obj.aggregate.path; // If not in index, add it and a new aggregation object if (!pathMap.hasOwnProperty(path)) { pathMap[path] = agg.length; agg.push({path: path, visits:0, clicks:0}); } // target is for convenience, add visits and clicks let target = agg[pathMap[path]]; target.visits += obj.visits; target.clicks += obj.clicks; return agg; }, []); // Show result console.log(aggData);

about 4 years ago · Juan Pablo Isaza Denunciar

0

Matriz de mapas con desestructuración inicial, utilizando la sintaxis de propagación ES6. Luego, reduzca la contabilidad de las rutas recorridas anteriormente, sumando las visitas y los clics en la ruta adecuada.

 const res = data .map(({ aggregate, ...rest }) => ({ path: aggregate.path, ...rest })) .reduce((acc, c, i, arr) => { let curr = Object.assign({}, c); const traversed = acc.some(item => item.hasOwnProperty('path') && item.path === curr.path); if (traversed) return acc; arr.forEach((v, idx) => { if (idx !== i && c.path === v.path) { curr = { ...curr, visits: v.visits + curr.visits, clicks: v.clicks + curr.clicks } } }) return [...acc, curr]; }, [])
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda