How to group Jsons by data?

Asked

Viewed 41 times

0

I need to transform data that would come in the following structure:

[
    {id_fornecedor: '100', id_pedido: '9000', id_produto: '4455', quantidade: '5' },
    {id_fornecedor: '100', id_pedido: '9000', id_produto: '4456', quantidade: '2' },
    {id_fornecedor: '100', id_pedido: '9001', id_produto: '4457', quantidade: '3' }
]

In the following structure:

[
    { id_fornecedor: '100', 
      pedidos: [ 
          { 
            id_pedido: '9000', 
            itens: [ 
                      {id_produto: '4455', quantidade: '5'}, 
                      {id_produto: '4456', quantidade: '2'} 
                   ]
          }, 
          {
             id_pedido: '9001', 
             itens: [ 
                      {id_produto: '4457', quantidade: '3'} 
                    ] 
          } 
       ]
    }
]

Even though id_fornecedor and neither id_pedido will necessarily come ordered.

2 answers

1


This is not exactly a trivial question, the answer was basically a "do for me", but it doesn’t have to be explained, it’s basically a lot of if and else.

const dados = [{ id_fornecedor: '100', id_pedido: '9000', id_produto: '4455', quantidade: '5' }, { id_fornecedor: '100', id_pedido: '9000', id_produto: '4456', quantidade: '2' }, { id_fornecedor: '100', id_pedido: '9001', id_produto: '4457', quantidade: '3' }]

const dados_formatados = dados.reduce((acc, px) => {
    const fornecedor = acc.find(py => py.id_fornecedor === px.id_fornecedor)
    if (fornecedor) {
        const pedido = fornecedor.pedidos.find(pz => pz.id_pedido === px.id_pedido)
        if (pedido) {
            pedido.itens.push({
                id_produto: px.id_produto,
                quantidade: px.quantidade
            })
        } else {
            fornecedor.pedidos.push({
                id_pedido: px.id_pedido,
                itens: [{
                    id_produto: px.id_produto,
                    quantidade: px.quantidade
                }]
            })
        }
    } else {
        acc.push({
            id_fornecedor: px.id_fornecedor,
            pedidos: [{
                id_pedido: px.id_pedido,
                itens: [{
                    id_produto: px.id_produto,
                    quantidade: px.quantidade
                }]
            }]
        })
    }
    return acc
}, [])

console.log(dados_formatados)

  • Thanks for the answer, that’s right. I wasn’t very clear on the question, I was looking for a native solution, I figured it was something to do with . reduce() and I was right

0

If the transformed JSON does not need to be exactly the same as this, you can use the function groupBy of lodash:

const _ = require('lodash');

const itens = [
    {id_fornecedor: '100', id_pedido: '9000', id_produto: '4455', quantidade: '5' },
    {id_fornecedor: '100', id_pedido: '9000', id_produto: '4456', quantidade: '2' },
    {id_fornecedor: '100', id_pedido: '9001', id_produto: '4457', quantidade: '3' }
];

const itensAgrupados = _.groupBy(itens, 'id_fornecedor');

console.log(itensAgrupados);

The result will be:

{
    "100": [{
        "id_fornecedor": "100",
        "id_pedido": "9000",
        "id_produto": "4455",
        "quantidade": "5"
    }, {
        "id_fornecedor": "100",
        "id_pedido": "9000",
        "id_produto": "4456",
        "quantidade": "2"
    }, {
        "id_fornecedor": "100",
        "id_pedido": "9001",
        "id_produto": "4457",
        "quantidade": "3"
    }]
}
  • Annotated! For now I am looking for a native solution, but surely this is not correct :)

Browser other questions tagged

You are not signed in. Login or sign up in order to post.