Tengo una matriz de datos. Necesito encontrar los objetos correspondientes por campo de code y fusionarlos. ¿Cómo se pueden hacer?
const data = [ { id: 'K1', code: 'KBP', zone: 'zone-k1' }, { id: 'K2', code: 'KBP', zone: 'zone-k2' }, { id: 'H', code: 'HCL', zone: 'zone-h' } ] const expected = [ { id: ['K1', 'K2'], code: 'KBP', zone: ['zone-k1', 'zone-k2'] }, { id: 'H', code: 'HCL', zone: 'zone-h' } ] Intenté usar lodash uniqBy y groupBy , pero no tuve éxito. Supongo que debe hacerse a través de reducir:
const res = () => { const similar = data.reduce((item, acc) => { return item.id === acc.id; }) }Podría usar Array.prototype.reduce y agrupar los datos por code .
const data = [ { gateId: 'K1', code: 'KBP', zone: 'zone-k1' }, { gateId: 'K2', code: 'KBP', zone: 'zone-k2' }, { gateId: 'H', code: 'HCL', zone: 'zone-h' } ]; const dataset = data.reduce((acc, curr) => { if (acc[curr.code] === undefined) { acc[curr.code] = { code: curr.code, id: [curr.gateId], zone: [curr.zone], } } else { acc[curr.code].id.push(curr.gateId) acc[curr.code].zone.push(curr.zone) } return acc; }, {}); const res = Object.values(dataset); console.log(res); .as-console-wrapper{ min-height: 100vh !important; top: 0}Por más que puedas ver esta respuesta
Puede usar Array.prototype.reduce y agrupar los objetos por su code .
Nota: Según el OP, para los códigos que solo tienen una identificación única, el campo de id necesita una cadena y no una matriz y esta respuesta se adhiere a eso.
const data = [ { id: "K1", code: "KBP", zone: "zone-k1" }, { id: "K2", code: "KBP", zone: "zone-k2" }, { id: "K3", code: "KBP", zone: "zone-k3" }, { id: "H", code: "HCL", zone: "zone-h" }, ]; const output = Object.values( data.reduce((o, d) => { const temp = o[d.code]; if (temp) { if (Array.isArray(temp?.id)) { temp.id.push(d.id); temp.zone.push(d.zone); } else { temp.id = [temp.id, d.id]; temp.zone = [temp.zone, d.zone]; } } else { o[d.code] = d; } return o; }, {}) ); console.log(output);Puede agrupar y tomar las propiedades deseadas para los grupos.
const data = [{ id: 'K1', code: 'KBP', zone: 'zone-k1' }, { id: 'K2', code: 'KBP', zone: 'zone-k2' }, { id: 'H', code: 'HCL', zone: 'zone-h' }], result = _(data) .groupBy('code') .map((items, code) => ({ id: _.map(items, 'id'), code, zone: _.map(items, 'zone'), })) .value(); console.log(result); .as-console-wrapper { max-height: 100% !important; top: 0; } <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>