¿Cómo podemos usar el método Array.find() en lugar del bucle for en este código?
onLoadTickets() { const ticketsReq = this.ticketService.getTickets(); const tariffsReq = this.tariffService.getTariffs(); forkJoin([ticketsReq, tariffsReq]).subscribe(results => { const data = results[0]; const tariffResp = results[1]; this.tickets = data.requests; for (let i = 0; i < this.tickets.length; i++) { for (let j = 0; j < tariffResp.tariffs?.length; j++) { if (tariffResp.tariffs[j].id == this.tickets[i].tariffId) { this.tickets[i].tariff = tariffResp.tariffs[j] } } } }); }Nota :
Usar el método find() no es obligatorio. Tengo que escribir este código con cualquier método de matriz.
Editar: he usado los métodos map() e include(). mi solución:
const tariffIds = tariffResp.tariffs.map((tariff: Tariffs) => tariff.id); this.tickets.map((item) => { if (tariffResp.tariffs === null || tariffResp.tariffs === undefined) { return item; } if (tariffIds.includes(item.tariffId)) { item.tariff = tariffResp.tariffs[tariffIds.indexOf(item.tariffId)]; } return item; });Esto funciona, pero no estoy seguro de que sea la mejor solución.
El método Array.find() devuelve el primer elemento de la matriz proporcionada que satisface la función de prueba proporcionada.
Entonces, si en su caso solo tiene una tarifa para todos los boletos, puede continuar con Array.find() pero si tiene varias tarifas y múltiples boletos, puede continuar con Array.filter() .
Demostración con Array.find() :
const tickets = [{ tariffId: 1, name: 'Ticket 1' }, { tariffId: 2, name: 'Ticket 2' }]; const tariffResp = { tariffs: [{ id: 1 }] }; const result = tickets.find((obj) => tariffResp.tariffs[0].id); console.log(result); Demostración con Array.map() junto con Array.filter() :
const tickets = [{ tariffId: 1, name: 'Ticket 1' }, { tariffId: 2, name: 'Ticket 2' }, { tariffId: 3, name: 'Ticket 3' }]; const tariffResp = { tariffs: [{ id: 1 }, { id: 2 }] }; const result = tariffResp.tariffs.map((obj) => { return tickets.filter((ticketObj) => obj.id === ticketObj.tariffId); }); console.log(result);this.tickets=data.request.map(x=>{ const obj:any=x; obj.tariff=tariffResp.find(t=>t.id==x.tariffId) return obj })Recorre data.request usando map. map transforma una matriz en otra
Primero creas un objeto con los valores de x
Después de agregar una nueva propiedad "tariff" que es el "tariffResp" que tiene la propiedad "id" igual a la propiedad "tariffId" de x