Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

137
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda