Home > Enterprise >  how can find or filter key value pairs between two arrays of objects
how can find or filter key value pairs between two arrays of objects

Time:08-30

I am looking for matches between two arrays of objects, and it returns an array of an object or objects where the matches were found, what I did was go through the first array, and iterate the first object and get its keys, from there go through the second array and iterate in each object in search of a match, if there is a match, return that object where the match appeared, if there were no matches, continue with the second object of the first array and repeat the operation until there are no more objects the first array. Note: If it found more than one match, return an array of the objects where the matches were. What I have so far is that it only returns one object, that is, the first match, but if I have more matches, it does not return them.

 function compararObjetos(userData, collectionData) {
     for (let index = 0; index < userData.length; index  ) {
     const element = userData[index];
     let keys = Object.keys(element);
     return collectionData.filter(function(obj) {
     for (let i = 0; i < keys.length; i  ) {
     if (!obj.hasOwnProperty(keys[i]) || obj[keys[i]] !== element[keys[i]]) {
      return false;
    }    
  }
  return true;
  })
}
}
compararObjetos(
[
{partido: "Partido 8", categoria: "2"}, 
{partido: "Partido 13", categoria: "3"}
],
[
{
"partido": "Partido 8",
"Equipo_Local": "Argentina",
"Equipo_Visitante": "Arabia Saudí",
"categoria_1": "1",
"categoria": "2",
"Categoria_3": "No disponible"
},
{
"partido": "Partido 24",
"Equipo_Local": "Argentina",
"Equipo_Visitante": "México",
"Categoria_1": "Disponible",
"categoria": "2",
"Categoria_3": "disponible"
},
{
"partido": "Partido 13",
"Equipo_Local": "Polonia",
"Equipo_Visitante": "Argentina",
"Categoria_1": "No disponible",
"Categoria_2": "No disponible",
"categoria": "3"
}
]
)

console.log(compararObjetos(
[
{partido: "Partido 8", categoria: "2"},
{partido: "Partido 13", categoria: "3"}
],
[
{
"partido": "Partido 8",
"Equipo_Local": "Argentina",
"Equipo_Visitante": "Arabia Saudí",
"categoria_1": "1",
"categoria": "2",
"Categoria_3": "No disponible"
},
{
"partido": "Partido 24",
"Equipo_Local": "Argentina",
"Equipo_Visitante": "México",
"Categoria_1": "Disponible",
"categoria": "2",
"Categoria_3": "disponible"
},
{
"partido": "Partido 13",
"Equipo_Local": "Polonia",
"Equipo_Visitante": "Argentina",
"Categoria_1": "No disponible",
"Categoria_2": "No disponible",
"categoria": "3"
}
]
))

CodePudding user response:

I think your solution is close. The first thing I changed is I used Object.entries to get the key/value pairs for each item in user data to compare against the collection data, and then just checked if the matching property in collectionData equaled the corresponding value in userData. The other thing I changed is that I checked the length of the matches to determine whether to return the matches or to continue the loop - this will fix the case of not returning the results of the first object in the userData every time. If no matches are found, it will continue to the second, third, etc. object until matches are found. If no matches are found, it will return null.

let data=[{partido:"Partido 8",Equipo_Local:"Argentina",Equipo_Visitante:"Arabia Saud\xc3\xad",categoria_1:"1",categoria:"2",Categoria_3:"No disponible"},{partido:"Partido 24",Equipo_Local:"Argentina",Equipo_Visitante:"M\xc3\xa9xico",Categoria_1:"Disponible",categoria:"2",Categoria_3:"disponible"},{partido:"Partido 13",Equipo_Local:"Polonia",Equipo_Visitante:"Argentina",Categoria_1:"No disponible",Categoria_2:"No disponible",categoria:"3"}]

function compararObjetos(userData, collectionData) {
  for (let index = 0; index < userData.length; index  ) {
    const element = userData[index];
    let matches = collectionData.filter(function(obj) {
      return Object.entries(element).some(([key, value]) => {
        return obj[key] === value;
      });
    });
    if (matches.length === 1) { return matches[0]; }
    else if (matches.length > 1) { return matches; }
  }
  return null;
}

console.log("Return Single Object Match..")
console.log(compararObjetos(
  [
    {partido: "Partido 8234234", categoria: "2123123"},
    {partido: "Partido 13", categoria: "3"}
  ],
  data
))

console.log("Return Array of Matches..")
console.log(compararObjetos(
  [
    {partido: "Partido 8", categoria: "2"},
    {partido: "Partido 13", categoria: "3"}
  ],
  data
))

console.log("Return null for no matches..")
console.log(compararObjetos(
  [
    {partido: "Partido 8234234", categoria: "2123123"},
    {partido: "Partido asdf13", categoria: "323423"}
  ],
  data
))

CodePudding user response:

you can simply do :

function compararObjetos(userData, collectionData)
  {
  let userCollection = []

  userData.forEach (uRow =>
    {
    let keys = Object.keys( uRow )
    collectionData.forEach( cRow =>
      {
      if (keys.reduce((t,k)=> t && (uRow[k]===cRow[k]),true))
        userCollection.push({...cRow})
      })
    })
  return userCollection
  }

const
  dataUser = 
    [ { partido: 'Partido 8',  categoria: '2' } 
    , { partido: 'Partido 13', categoria: '3' } 
    ] 
, dataCollection = 
    [ { partido          : 'Partido 8'
      , Equipo_Local     : 'Argentina'
      , Equipo_Visitante : 'Arabia Saudí'
      , categoria_1      : '1'
      , categoria        : '2'
      , Categoria_3      : 'No disponible'
      } 
    , { partido          : 'Partido 24'
      , Equipo_Local     : 'Argentina'
      , Equipo_Visitante : 'México'
      , Categoria_1      : 'Disponible'
      , categoria        : '2'
      , Categoria_3      : 'disponible'
      } 
    , { partido          : 'Partido 13'
      , Equipo_Local     : 'Polonia'
      , Equipo_Visitante : 'Argentina'
      , Categoria_1      : 'No disponible'
      , Categoria_2      : 'No disponible'
      , categoria        : '3'
      } 
    ]
    


console.log( compararObjetos(dataUser, dataCollection) )
.as-console-wrapper {max-height: 100% !important;top: 0;}
.as-console-row::after {display: none !important;}

  • Related