Tengo un objeto de matriz
const admins= [ { id: 1, name: 'Admin 1', }, { id: 2, name: 'Admin 2', }, { id: 3, name: 'Admin 3', } ]y otro objeto de matriz
const members= [ { id: 1, name: 'Name 1', addedByAdminId: 1 }, { id: 2, name: 'Name 2', addedByAdminId: 2 }, { id: 3, name: 'Name 3', addedByAdminId: 3 } ]Quiero reemplazar los valores de addedByAdminId del miembro arrayObject por los nombres de los administradores donde admins.id = addedByAdminId
Mi código actual:
const objectC = members.forEach((item) => item.addedByAdminId= admins.filter(obj => obj.id === item.addedByAdminId)[0]['name']);
Resultado Esperado :
objectC = [ { id: 1, name: 'Name 1', addedByAdminId: 'Admin 1' }, { id: 2, name: 'Name 2', addedByAdminId: 'Admin 2' }, { id: 3, name: 'Name 3', addedByAdminId: 'Admin 3' } ]Error que recibo: error de tipo no detectado: no se pueden leer las propiedades de undefined (leyendo 'nombre')
Estoy usando Reaccionar.
Bienvenido a stackoverflow.
Esto es lo que quieres hacer:
const newMembers = members.map(member => { // get the admin name const adminName = admins.find(it => it.id === member.addedByAdminId)?.name; // create a new object with the spread operator // containing everything from the memmber object // overriding the property addedByAdminId with the variable adminName return {...member, addedByAdminId: adminName} });Resultado
[ { "id": 1, "name": "Name 1", "addedByAdminId": "Admin 1" }, { "id": 2, "name": "Name 2", "addedByAdminId": "Admin 2" }, { "id": 3, "name": "Name 3", "addedByAdminId": "Admin 3" } ]Pero esto es lo que sugiero: en lugar de anular una variable con un valor que no coincida con este nombre de variable, simplemente cree una nueva.
Código:
const newMembers = members.map(member => { const adminName = admins.find(it => it.id === member.addedByAdminId)?.name; return {...member, addedByAdminName: adminName} });Resultado
[ { "id": 1, "name": "Name 1", "addedByAdminId": 1, "addedByAdminName": "Admin 1" }, { "id": 2, "name": "Name 2", "addedByAdminId": 2, "addedByAdminName": "Admin 2" }, { "id": 3, "name": "Name 3", "addedByAdminId": 3, "addedByAdminName": "Admin 3" } ]Así como esto?
const admins = [ { id: 1, name: 'Admin 1', }, { id: 2, name: 'Admin 2', }, { id: 3, name: 'Admin 3', } ] const members = [ { id: 1, name: 'Name 1', addedByAdminId: 1 }, { id: 2, name: 'Name 2', addedByAdminId: 2 }, { id: 3, name: 'Name 3', addedByAdminId: 3 } ] const objC = members.map(({ id, name, addedByAdminId }) => ({ id, name, addedByAdminId: admins[addedByAdminId - 1].name })) console.log(objC)esto reemplazará addedByAdminId con el nombre cuando un registro coincidente esté presente en la matriz de administración. si no se encuentra ningún registro coincidente con addedByAdminId, addedByAdminId no se reemplazará.
{ id: 1, name: 'Admin 1', }, { id: 2, name: 'Admin 2', }, { id: 3, name: 'Admin 3', } ] const members = [ { id: 1, name: 'Name 1', addedByAdminId: 1 }, { id: 2, name: 'Name 2', addedByAdminId: 2 }, { id: 3, name: 'Name 3', addedByAdminId: 3 }, { id: 4, name: 'Name 4', addedByAdminId: 4 } ] const result = members.map(({ id, name, addedByAdminId }) => ({ id, name, addedByAdminId: admins.some(admin => admin.id === addedByAdminId) ? admins.find(admin => admin.id === addedByAdminId).name : addedByAdminId })) console.log(result);