Tengo un objeto que simula las relaciones de una base de datos con varias matrices y quiero una venta que tenga un género musical (en este caso, la venta con id: 1), pero mi código devuelve todas las ventas. Uso los métodos de filtro y mapa para simular una selección y unión desde SQL.
const db = { events: [ { id: "1", name: "Rock in Rio 2020", genre: "Music", }, { id: "2", nome: "World Cup 2022", genre: "Sport", }, ], tickets: [ { id: "1", eventId: "1", name: "Day 3", description: "Music Concert", }, { id: "2", eventId: "1", name: "France x Brazil", description: "Football Match", }, ], sales: [ { id: "1", ticketId: "1", value: "100", }, { id: "2", ticketId: "2", value: "200", }, ], }; const musicSales = db.sales.filter((sale) => { return db.tickets.map((ticket) => { return db.events.map((event) => { return ( sale.ticketId === ticket.id && event.id === ticket.eventId && event.genre === "Music" ); }); }); }); console.log(musicSales);¿Algúna idea de cómo arreglar esto?
Si su intención es recuperar una lista de ventas que tienen entradas para eventos de música, simplemente puede usar el filter y evitar el mapeo.
Por ejemplo
const musicSales = db.sales.filter((sale) => { const ticket = db.tickets[sale.ticketId]; const event = db.events[ticket.eventId]; return event.genre === "Music"; });Esto filtra las ventas, buscando el ticket de cada venta y el evento de cada ticket.
Tenga en cuenta que este código asume que cada venta tiene un boleto correspondiente y que cada boleto tiene un evento correspondiente. Si estas suposiciones no se cumplen, deberá agregar algunas declaraciones if para verificar si existen las entradas y los eventos.
Podrías intentar cualquiera de los siguientes:
const musicSales = db.events.filter(event => event.genre == 'Music').map(event => db.sales.find(sale => sale.id == event.id)); const musicSales = db.events.map(event => { if(event.genre == 'Music'){ return db.sales.find(sale => sale.id == event.id); } });.filter(Boolean);Creo que está tratando de obtener todas las ventas correspondientes a un boleto con ID de evento 1.
Si ese es el caso, puedes hacer:
const musicSales db.sales.filter(sale => sale.ticketId in db.tickets.filter(ticket => ticket.eventId === "1"));La devolución de llamada del filtro de tickets devuelve verdadero si el ticket tiene eventId igual a "1".
La devolución de llamada del filtro de ventas devuelve verdadero si la venta tiene ticketId dentro del resultado del filtro de boletos.