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

98
Visualizações
Reduzca múltiples propiedades en una matriz de una matriz de objetos y omita otras propiedades usando Ramda

Tengo esta matriz de matrices con objetos:

 const data = [ [ { index: 320, blocks: 2, value: '31011784785', participants: 1222, cost: '1286828506' }, { index: 319, blocks: 0, value: '111306385', participants: 18, cost: '0' }, { index: 318, blocks: 0, value: '14550473', participants: 10, cost: '0' } ], [ { index: 320, blocks: 1, value: '7089001673', participants: 492, cost: '648196615' }, { index: 319, blocks: 0, value: '13551137', participants: 8, cost: '0' }, { index: 318, blocks: 0, value: '11499815', participants: 5, cost: '0' } ], [ { index: 320, blocks: 1, value: '408900161', participants: 200, cost: '648196615' }, { index: 319, blocks: 0, value: '23551231', participants: 10, cost: '0' }, { index: 318, blocks: 0, value: '104324219', participants: 5, cost: '0' } ] ]

Me gustaría hacer una sola matriz con objetos que solo tengan las propiedades índice, valor y participantes, donde el valor y los participantes serán la suma de las 3 matrices. P.ej:

 [ { index: 320, value: 38509686619, participants: 1914, }, { index: 319, value: 148408753, participants: 36, }, { ... } ]

También me gustaría que el campo de valor sea BigInt.

Inspirado por esta respuesta , hice algo que funciona pero es demasiado largo y engorroso.

Esta pregunta es diferente de Reducir matriz de matriz de objetos usando Ramda porque necesito dos valores de propiedad de objeto y no sé cómo hacerlo.

about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

Solución Vanila JS:

 const data = [[{"index":320,"blocks":2,"value":"31011784785","participants":1222,"cost":"1286828506"},{"index":319,"blocks":0,"value":"111306385","participants":18,"cost":"0"},{"index":318,"blocks":0,"value":"14550473","participants":10,"cost":"0"}],[{"index":320,"blocks":1,"value":"7089001673","participants":492,"cost":"648196615"},{"index":319,"blocks":0,"value":"13551137","participants":8,"cost":"0"},{"index":318,"blocks":0,"value":"11499815","participants":5,"cost":"0"}],[{"index":320,"blocks":1,"value":"408900161","participants":200,"cost":"648196615"},{"index":319,"blocks":0,"value":"23551231","participants":10,"cost":"0"},{"index":318,"blocks":0,"value":"104324219","participants":5,"cost":"0"}]]; const result = Object.values(data.flat() .reduce((acc, { index, value, participants }) => { acc[index] ??= { index, value: 0, participants: 0 }; acc[index].value += Number(value); acc[index].participants += Number(participants); return acc; }, {})); console.log(result);
 .as-console-wrapper{min-height: 100%!important; top: 0}

about 4 years ago · Juan Pablo Isaza Relatório

0

Un enfoque Ramda:

 const convert = pipe ( transpose, map (xs => ({ index: xs [0] .index, value: xs .reduce ((a, {value}) => a + Number (value), 0), participants: sum (pluck ('participants') (xs)) })) ) const data = [[{index: 320, blocks: 2, value: "31011784785", participants: 1222, cost: "1286828506"}, {index: 319, blocks: 0, value: "111306385", participants: 18, cost: "0"}, {index: 318, blocks: 0, value: "14550473", participants: 10, cost: "0"}], [{index: 320, blocks: 1, value: "7089001673", participants: 492, cost: "648196615"}, {index: 319, blocks: 0, value: "13551137", participants: 8, cost: "0"}, {index: 318, blocks: 0, value: "11499815", participants: 5, cost: "0"}], [{index: 320, blocks: 1, value: "408900161", participants: 200, cost: "648196615"}, {index: 319, blocks: 0, value: "23551231", participants: 10, cost: "0"}, {index: 318, blocks: 0, value: "104324219", participants: 5, cost: "0"}]] console .log (convert (data))
 .as-console-wrapper {max-height: 100% !important; top: 0}
 <script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.min.js"></script> <script> const {pipe, transpose, map, sum, pluck, reduce, applySpec} = R </script>

Comenzamos con transpose , que lo convierte en un formato mucho más fácil de trabajar. Luego, para cada nueva fila, tomamos el índice del primer registro y sumamos tanto los participantes como los valores.

Debido a que BigInt no se muestra bien en la consola SO, los omití, pero el cambio es trivial:

 - value: xs .reduce ((a, {value}) => a + Number (value), 0), + value: xs .reduce ((a, {value}) => a + BigInt(value), BigInt(0)),

Una versión sin puntos, si tienes ese fetiche, no es mucho más difícil:

 const convert = pipe ( transpose, map (applySpec ({ index: pipe (head, prop ('index')), value: reduce ((a, {value}) => a + Number (value), 0), // value: reduce ((a, {value}) => a + BigInt (value), BigInt (0)), participants: pipe (pluck ('participants'), sum) })) )
about 4 years ago · Juan Pablo Isaza Relatório

0

Después de aplanar la matriz de matrices, debe mapear y elegir las propiedades deseadas y convertir los values en un número, y luego agrupar y combinar cada grupo en un solo objeto.

 const { mergeWithKey, pipe, flatten, map, pick, evolve, groupBy, prop, reduce, values } = R // merge deep and combine properties value const combine = mergeWithKey((k, l, r) => k === 'value' || k === 'participants' ? l + r : r) const mergeData = pipe( flatten, // flatten to a single array map(pipe( pick(['index', 'value', 'participants']), // pick wanted properties evolve({ value: Number }) // convert values to a number )), groupBy(prop('index')), // group by the name map(reduce(combine, {})), // combine each group to a single object values, // convert back to array ) const data = [[{"index":320,"blocks":2,"value":"31011784785","participants":1222,"cost":"1286828506"},{"index":319,"blocks":0,"value":"111306385","participants":18,"cost":"0"},{"index":318,"blocks":0,"value":"14550473","participants":10,"cost":"0"}],[{"index":320,"blocks":1,"value":"7089001673","participants":492,"cost":"648196615"},{"index":319,"blocks":0,"value":"13551137","participants":8,"cost":"0"},{"index":318,"blocks":0,"value":"11499815","participants":5,"cost":"0"}],[{"index":320,"blocks":1,"value":"408900161","participants":200,"cost":"648196615"},{"index":319,"blocks":0,"value":"23551231","participants":10,"cost":"0"},{"index":318,"blocks":0,"value":"104324219","participants":5,"cost":"0"}]] const results = mergeData(data) console.log(results)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous"></script>

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