Estoy tratando de agregar una propiedad con un cierto valor a todos los objetos en una matriz, en función de un valor correspondiente en otra matriz.
const array1 = [ { id: 1, date: '2022.05.01', name: 'john' }, { id: 2, date: '2022.05.01', name: 'sam' }, { id: 3, date: '2022.05.03', name: 'john' }, { id: 4, date: '2022.05.06', name: 'jack' }, ]Esta matriz contiene las modificaciones requeridas que deben realizarse:
const array2 = [ { name: 'john', isCanceled: true, }, { name: 'jack', isCanceled: false, }, { name: 'sam', isCanceled: false, }, ] Si el nombre en el objeto dentro de array1 es john entonces isCanceled debe establecerse en true , pero si es jack o sam debe establecerse en false así:
const resultArray = [ { id: 1, date: '2022.05.01', name: 'john', isCanceled: true, }, { id: 2, date: '2022.05.01', name: 'sam' isCanceled: false, }, { id: 3, date: '2022.05.03', name: 'john' isCanceled: true, }, { id: 4, date: '2022.05.06', name: 'jack' isCanceled: false, }, ];Cree un objeto de búsqueda de status que contenga el estado y asigne su matriz para incluir los valores coincidentes del objeto de búsqueda:
const status = Object.fromEntries( array2.map(({name, isCanceled}) => [name, isCanceled]) ); const resultArray = array1.map(({id, date, name}) => ({ id, date, name, isCanceled: status[name] })); Alternativamente, si solo desea modificar la array1 1 en lugar de crear una nueva matriz, el segundo paso se puede reemplazar con:
array1.forEach(v => v.isCanceled = status[v.name]);Fragmento completo:
const array1 = [{ id: 1, date: '2022.05.01', name: 'john' }, { id: 2, date: '2022.05.01', name: 'sam' }, { id: 3, date: '2022.05.03', name: 'john' }, { id: 4, date: '2022.05.06', name: 'jack' }, ]; const array2 = [{ name: 'john', isCanceled: true, }, { name: 'jack', isCanceled: false, }, { name: 'sam', isCanceled: false, }, ]; const status = Object.fromEntries( array2.map(({name, isCanceled}) => [name, isCanceled]) ); const resultArray = array1.map(({id, date, name}) => ({ id, date, name, isCanceled: status[name] })); console.log(resultArray); Si se pregunta por qué prefiero construir el objeto de búsqueda en lugar de usar find() dentro de la operación map() : en términos de complejidad, la tabla de búsqueda tiene una complejidad de O(1) , mientras que el enfoque find() es O( n) .
puedes hacer algo como:
const result = array1.map(person => { const lookPerson = array2.find(person2 => person2.name === person.name); return (lookPerson) ? { ...person, isCanceled: lookPerson.isCanceled } : person; });combine array.map para transformar array1
use array.find para obtener la primera iteración de una persona similar entre array1 y array2
fusionar objeto con
{ ...person, isCanceled: lookPerson.isCanceled } const array1 = [{ id: 1, date: '2022.05.01', name: 'john' }, { id: 2, date: '2022.05.01', name: 'sam' }, { id: 3, date: '2022.05.03', name: 'john' }, { id: 4, date: '2022.05.06', name: 'jack' }, ]; const array2 = [{ name: 'john', isCanceled: true, }, { name: 'jack', isCanceled: false, }, { name: 'sam', isCanceled: false, }, ]; const result = array1.map(person => { const lookPerson = array2.find(person2 => person2.name === person.name); return (lookPerson) ? { ...person, isCanceled: lookPerson.isCanceled } : person; }); console.log(result);Puede hacer esto más simplemente convirtiendo primero su array2 en un objeto y luego usando una búsqueda dentro de un map como este:
const array1 = [{id:1,date:"2022.05.01",name:"john"},{id:2,date:"2022.05.01",name:"sam"},{id:3,date:"2022.05.03",name:"john"},{id:4,date:"2022.05.06",name:"jack"},]; const array2 = [{name:"john",isCanceled:true},{name:"jack",isCanceled:false},{name:"sam",isCanceled:false}]; const arrCancel = array2.reduce((a, { name, isCanceled }) => { a[name] = isCanceled; return a; }, {}); const resultArr = array1.map(e => { e.isCanceled = arrCancel[e.name]; return e; }); console.log(resultArr); .as-console-wrapper { max-height: 100% !important; top: auto; }