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; }