es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo hacer un “inner join” entre dos arrays mediante una clave en JavaScript?

Tengo dos matrices que contienen objetos de esta manera:

const array1 = 
[
{
    "id": 1,
    "mass": 149,
    "height": 180,
    "dob": "2003-09-04"
},
{
    "id": 2,
    "mass": 140,
    "height": 175,
    "dob": "2000-02-12",
},
{
    "id": 3,
    "mass": 143,
    "height": 170,
    "dob": "2001-11-04" 
}
]

const array2 = 
[
{
    "id": 1,
    "name": "James",
    "sport": "Football"
},
{
    "id": 2,
    "name": "Adam",
    "sport": "Tennis"
}
]

Me gustaría combinarlos de manera que la matriz combinada solo contenga datos en los que el “id” aparezca tanto en array1 como en array2.

Hasta ahora estoy utilizando lodash _.merge que devuelve:

const merged = _.merge(array1, array2)

merged = [
{
"id": 1,
"mass": 149,
"height": 180,
"dob": "2003-09-04",
"name": "James",
"sport": "Football"
},
{
"id": 2,
"mass": 140,
"height": 175,
"dob": "2000-02-12",
"name": "Adam",
"sport": "Tennis"
},
{
"id": 3,
"mass": 143,
"height": 170,
"dob": "2001-11-04" ,
}
]

Me gustaría que “merged” solo contenga datos en los que el “id” aparezca en ambos, es decir:

[{
"id": 1,
"mass": 149,
"height": 180,
"dob": "2003-09-04",
"name": "James",
"sport": "Football"
},
{
"id": 2,
"mass": 140,
"height": 175,
"dob": "2000-02-12",
"name": "Adam",
"sport": "Tennis"
}]

Creo que la función equivalente en SQL sería un “Inner join”.

¡Cualquier ayuda sería muy apreciada!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para combinar las dos matrices de manera que solo los datos con el mismo id aparezcan en la matriz final, puedes usar el método Array.filter() y el método Array.find(). Aquí tienes un ejemplo:

    const merged = array1.filter(obj1 => {
      const found = array2.find(obj2 => obj2.id === obj1.id);
      return found ? { ...obj1, ...found } : false;
    });
    

    Lo que esto hace es iterar a través de array1 usando el método Array.filter(), y para cada objeto en array1, busca un objeto con el mismo id en array2 usando el método Array.find(). Si encuentra una coincidencia, fusiona los dos objetos usando la sintaxis de propagación (...), y devuelve el objeto fusionado. Si no encuentra una coincidencia, devuelve false y lo filtra de la matriz final.

    La matriz resultante merged contendrá sólo datos donde id aparezca en ambas array1 y array2.

Comments are closed.