Tengo el siguiente código:
interface Stop { code: string } interface FareZone { name: string; stops: Stop[]; } const outbound: FareZone[] = [{name: 'Zone A', stops: [{ code: 'C00'}] }, {name: 'Zone B', stops: [{ code: 'C01'}, { code: 'C02'}] }]; const inbound: FareZone[] = [{name: 'Zone A', stops: [{ code: 'C00'}, { code: 'C04'}] }, {name: 'Zone C', stops: [{ code: 'C08'}] }];Me gustaría terminar con la siguiente lista combinada:
const combined: FareZone[] = [ {name: 'Zone A', stops: [{ code: 'C00'}, { code: 'C04'}] }, {name: 'Zone B', stops: [{ code: 'C01'}, { code: 'C02'}] }, {name: 'Zone C', stops: [{ code: 'C08'}] } ];La lógica
La nueva lista combinada debe tener todas las zonas posibles una vez (el nombre en FareZone es único). Cuando existe una zona en ambas listas (la de entrada y la de salida), sus paradas deben combinarse y ser únicas.
¿Cuál es una forma elegante de lograr esto en JavaScript/TypeScript? Aquí hay un CodePen .
PD. Pude hacer esto, pero tomó muchas líneas de código y fue complicado.
Básicamente, recorrí la primera lista y encontré los elementos que no existían en la otra, y luego hice lo mismo con la segunda lista, luego combiné las paradas en cada lista.
ACTUALIZACIÓN : No creo que mi pregunta sea un duplicado de esta . Ese se trata de eliminar duplicados en una sola matriz, este se trata de combinar dos matrices de objetos complejos con algo de lógica.
Eso es básicamente lo que tienes que hacer. Pero no me parece tan desordenado o complicado.
function combine(a: FareZone[], b: FareZone[]) : FareZone[] { const res = [...a] b.forEach(zone => { const aZone = res.find(x=> x.name == zone.name); if (!aZone) { res.push(zone); } else { zone.stops.forEach(stop => {if (!aZone.stops.some(s => s.code == stop.code)) { aZone.stops.push(stop); }}) } }) return res; }