繁体   English   中英

如何在对象的两个 arrays 之间查找或过滤键值对

[英]how can find or filter key value pairs between two arrays of objects

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通过第二个数组并在每个 object 中迭代以寻找匹配项,如果有匹配项,则返回匹配项出现的 object,如果没有匹配项,则继续执行第二个 object 的操作,直到出现第一个数组并重复第一个操作不再是第一个数组的对象。 注意:如果找到多个匹配项,则返回匹配项所在的对象数组。 到目前为止我得到的是它只返回一个object,即第一个匹配,但如果我有更多匹配,它不会返回它们。

 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" } ] ))

我认为您的解决方案很接近。 我更改的第一件事是我使用Object.entries获取用户数据中每个项目的键/值对以与集合数据进行比较,然后检查 collectionData 中的匹配属性是否等于 userData 中的相应值。 我更改的另一件事是我检查了匹配的长度以确定是返回匹配还是继续循环 - 这将解决每次都不返回 userData 中第一个 object 的结果的情况。 如果没有找到匹配,它将继续到第二个、第三个等 object 直到找到匹配。 如果没有找到匹配项,它将返回 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 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).every(([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 ))

正如我在这里的第一条评论中告诉你的那样:
您的任何return都会退出function (并忽略循环继续)

否则,您的代码有点复杂,而且您忽略使用缩进的事实使阅读更加不愉快。

你可以简单地做:

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

此代码也适用于这种情况:

const dataUser = 
    [ { Equipo_Visitante : 'México' } 
    , { partido: 'Partido 13', categoria: '3' } 
    ] 

 const dataUser = [ { Equipo_Visitante: 'México' }, { 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) ) 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 }
 .as-console-wrapper {max-height: 100%;important:top; 0.}:as-console-row::after {display; none !important;}

但是如果dataUser中的所有对象总是使用相同的属性,
你可以简单地做:

function compararObjetos(userData, collectionData)
  {
  if (userData.length === 0) return []  // empty array
  let keys =  Object.keys( userData[0] )

  return collectionData.filter( cRow =>
    userData.some( uRow =>
      keys.reduce((t,k)=> t && (uRow[k]===cRow[k]),true) ) )
  }

 function compararObjetos(userData, collectionData) { if (userData.length === 0) return [] // empty array let keys = Object.keys( userData[0] ) return collectionData.filter( cRow => userData.some( uRow => keys.reduce((t,k)=> t && (uRow[k]===cRow[k]),true) ) ) } 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;}

我就是这样做的。 这对我来说似乎更简洁和声明性。

我们首先循环我们想要返回的东西,collections。 对于每个集合,我们检查每个用户 object 以查看是否有任何集合值与相应的用户键匹配。

如果它是一个匹配项,并且该集合尚未添加到我们的匹配项中,我们添加它。

const userData = [
    { partido: "Partido 8", categoria: "2" },
    { partido: "Partido 13", categoria: "3" }
  ],
  collectionData = [
    {
      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"
    },
    // does not match
    {
      partido: "Partido 11",
      Equipo_Local: "Polonia",
      Equipo_Visitante: "Argentina",
      Categoria_1: "No disponible",
      Categoria_2: "No disponible",
      categoria: "34"
    }
  ];

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

  collectionData.forEach((collection) => {
    userData.forEach((user) => {
      Object.keys(user).forEach((key) => {
        if (
          user[key] === collection[key] &&
          !matches.find((match) => match === collection)
        ) {
          matches.push(collection);
        }
      });
    });
  });

  return matches;
}

console.log(compararObjetos(userData, collectionData));

https://codesandbox.io/s/get-matches-two-arrays-of-objects-59wcoi

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM