Necesito recorrer dos matrices y encontrar dónde está el valor expandido = verdadero establecido en la primera matriz.
ejemplo de la primera matriz:
[ { id: 1 , name: 'Test 1' , expended = false }, { id: 2 , name: 'Test 2' , expended = false }, { id: 3 , name: 'Test 3' , expended = false } ]ejemplo de la segunda matriz:
[ { id: 1 , name: 'Test 1' , expended = false }, { id: 2 , name: 'Test 2' , expended = true }, { id: 3 , name: 'Test 3' , expended = false } ]La diferencia entre dos matrices es solo el valor gastado donde está en la segunda matriz:
{ id: 2 , name: 'Test 2' , expended = true }Necesito hacer un bucle pensando en la primera matriz y en la segunda y encontrar en la segunda matriz donde se gasta = verdadero y simplemente pegar en la primera matriz.
El resultado esperado arriba después del bucle debería ser:
primer valor de matriz
[ { id: 1 , name: 'Test 1' , expended = false }, { id: 2 , name: 'Test 2' , expended = true }, { id: 3 , name: 'Test 3' , expended = false } ]¡Por favor, no puedo simplemente copiar el valor de toda la matriz!
este ejemplo no es aceptado:
este.segundoArray = este.primerArray..
Este es un ejemplo simple que te envié. ¡Tengo 10 parámetros más en el objeto que están cambiando, pero solo es importante para mí gastarme en copiar!
Literalmente, el valor gastado de la segunda matriz para copiar a la primera y ¡eso es todo!
Puede lograr el resultado usando Mapa y mapa
Puede establecer el valor de expended si el valor de expended de arr1 es falso como
arr1.map((o) => ({ ...o, expended: o.expended || map.get(o.id).expended })) const arr1 = [ { id: 1, name: "Test 1", expended: false }, { id: 2, name: "Test 2", expended: false }, { id: 3, name: "Test 3", expended: false }, ]; const arr2 = [ { id: 1, name: "Test 1", expended: false }, { id: 2, name: "Test 2", expended: true }, { id: 3, name: "Test 3", expended: false }, ]; const map = new Map(arr2.map((o) => [o.id, o])); const result = arr1.map((o) => ({ ...o, expended: o.expended || map.get(o.id).expended })); console.log(result); /* This is not a part of answer. It is just to give the output fill height. So IGNORE IT */ .as-console-wrapper { max-height: 100% !important; top: 0; }Si quieres el resultado con forEach
const arr1 = [ { id: 1, name: "Test 1", expended: false }, { id: 2, name: "Test 2", expended: false }, { id: 3, name: "Test 3", expended: false }, ]; const arr2 = [ { id: 1, name: "Test 1", expended: false }, { id: 2, name: "Test 2", expended: true }, { id: 3, name: "Test 3", expended: false }, ]; arr1.forEach((obj) => { const elementInArr2 = arr2.find((o) => o.id === obj.id); if (elementInArr2) obj.expended = obj.expended || elementInArr2.expended; }); console.log(arr1); /* This is not a part of answer. It is just to give the output fill height. So IGNORE IT */ .as-console-wrapper { max-height: 100% !important; top: 0; }Array#reduce , itere sobre la segunda matriz mientras actualiza un Map , si el expended del objeto es true , establezca la clave en la id y el valor en el objetoArray#map , itere sobre la primera matriz. Para cada objeto, verifique si el mapa anterior tiene su id y reemplácelo, de lo contrario, consérvelo let arr1 = [ { id: 1, name: 'Test 1', expended: false }, { id: 2, name: 'Test 2', expended: false }, { id: 3, name: 'Test 3', expended: false } ], arr2 = [ { id: 1, name: 'Test 1', expended: false }, { id: 2, name: 'Test 2', expended: true }, { id: 3, name: 'Test 3', expended: false } ]; const expenededMap = arr2.reduce((map, obj) => { if(obj.expended) map.set(obj.id, obj); return map; }, new Map); arr1 = arr1.map(obj => { if(obj.expended) return obj; const objFromArr2 = expenededMap.get(obj.id) || {}; return objFromArr2.expended ? objFromArr2 : obj; }); console.log(arr1); Usando solo Array#forEach y Array#find :
let arr1 = [ { id: 1, name: 'Test 1', expended: false }, { id: 2, name: 'Test 2', expended: false }, { id: 3, name: 'Test 3', expended: false } ], arr2 = [ { id: 1, name: 'Test 1', expended: false }, { id: 2, name: 'Test 2', expended: true }, { id: 3, name: 'Test 3', expended: false } ]; arr1.forEach((obj, i, arr) => { if(!obj.expended) { const objFromArr2 = arr2.find(({ id }) => id === obj.id) || {}; if(objFromArr2.expended) arr[i] = objFromArr2; } }); console.log(arr1);