Quiero crear una matriz (de salida) de objetos a partir de una o varias matrices (de entrada).
Para dos matrices de entrada definidas como:
var array1 = [ { id: 1, name: 'a1'}, { id: 2, name: 'a2'}, { id: 3, name: 'a3'}, { id: 4, name: 'a4'}, { id: 5, name: 'a5'}, ]; var array2 = [ { id: 1, name: 'a1', sub: { data: 'we' } }, { id: 2, name: 'a2', sub: { data: 'dfd' } }, { id: 5, name: 'a5', sub: { data: 'vbf' } }, ];... la matriz resultante (de salida) debería ser:
var newarray = [ { id: 1, name: 'a1', sub: { data: 'we' } }, { id: 2, name: 'a2', sub: { data: 'dfd' } }, { id: 3, name: 'a3', sub: {}}, { id: 4, name: 'a4', sub: {}}, { id: 5, name: 'a5', sub: { data: 'vbf' } }, ];He intentado lo siguiente, pero hay un error en alguna parte:
var newarray = []; var oArray = {}; for(var i = 0; i <= array1.length;) { for(var j = 0; j <= array2.length; j++) { if(array1[i].id === array2[j].id) { oArray = { "id": array1[i].id, "name": array1[i].name, "sub": array1[i].sub }; newarray.push(oArray); i++; break; } else { oArray = { "id": array1[i].id, "name": array1[i].name, "sub": array1[i].sub }; newarray.push(oArray); } } }Realmente debería asegurarse de que los límites de índice para sus bucles sean correctos. <=length causará un problema en cualquier matriz.
Además, sugeriría primero ingresar a la matriz desde array1 , y luego en el bucle interno buscando en la matriz para encontrar la identificación coincidente de array1 . Y simplemente actualizando.
var array1 = [ { id: 1, name: 'a1'}, { id: 2, name: 'a2'}, { id: 3, name: 'a3'}, { id: 4, name: 'a4'}, { id: 5, name: 'a5'}, ]; var array2 = [ { id: 1, name: 'a1', sub: { data: 'we' } }, { id: 2, name: 'a2', sub: { data: 'dfd' } }, { id: 5, name: 'a5', sub: { data: 'vbf' } }, ]; var newarray = []; for(var i = 0; i < array1.length;i++) { let oArray = { "id": array1[i].id, "name": array1[i].name, "sub": {} }; newarray.push(oArray); for(var j = 0; j < array2.length; j++) { if(array1[i].id === array2[j].id) { let found = newarray.find(x => x.id === array2[j].id); if(found) found.sub =array2[j].sub; } } } console.log(newarray); let found = newarray.find(x => x.id === array2[j].id);
find() se usa para buscar y devolver algo en la matriz según la condición específica. Si la función interna devuelve verdadero para cualquier índice de matriz, se devuelve el elemento en ese índice. En nuestra condición, verificamos que coincida con la id y volvemos en función de eso. Entonces, found es finalmente el elemento encontrado basado en la condición. Por eso solo si existe, estamos accediendo a su propiedad. Si no se encuentra, se vuelve undefined .
La función de flecha anterior bien podría escribirse como:
let found = newarray.find(function (x) { return (x.id === array2[j].id) });
Hay muchas otras formas de hacerlo, pero esta es la más cercana a su enfoque y lo mejora.
Puede usar el map para revisar la matriz y find para encontrar el elemento correspondiente y luego fusionarlos como desee.
const array1 = [ { id: 1, name: 'a1'}, { id: 2, name: 'a2'}, { id: 3, name: 'a3'}, { id: 4, name: 'a4'}, { id: 5, name: 'a5'}, ]; const array2 = [ { id: 1, name: 'a1', sub: { data: 'we' } }, { id: 2, name: 'a2', sub: { data: 'dfd' } }, { id: 5, name: 'a5', sub: { data: 'vbf' } }, ]; const outcome = array1.map((x) => { const corresponding = array2.find((y) => y.name === x.name); return { ...x, sub: corresponding ? corresponding.sub : {} } }); console.log(outcome);Usé una función de mapa en lugar de un bucle for. Aquí está mi solución:
var array1 = [ { id: 1, name: 'a1'}, { id: 2, name: 'a2'}, { id: 3, name: 'a3'}, { id: 4, name: 'a4'}, { id: 5, name: 'a5'}, ]; var array2 = [ { id: 1, name: 'a1', sub: { data: 'we' } }, { id: 2, name: 'a2', sub: { data: 'dfd' } }, { id: 5, name: 'a5', sub: { data: 'vbf' } }, ]; let noSubs = array1.filter(el => ! array2.map(element => element.id).includes(el.id)); let newArray = noSubs.concat(array2); console.log(newArray);