Javascript 数组比较函数返回两个数组

Javascript 数组比较函数返回两个数组,javascript,arrays,function,Javascript,Arrays,Function,在这两个变量中,第二个数组包含两个数组。在第二个数组中,我在Szentlőrinc中将homepoint改为1,因此比较函数应该只作为第三个数组返回 var array1 = [ [{"home":{"homename":"KFC Komarno","homepoint":"1"},"away":{"awayname":"Podbr

在这两个变量中,第二个数组包含两个数组。在第二个数组中,我在Szentlőrinc中将homepoint改为1,因此比较函数应该只作为第三个数组返回

    var array1 = [
    [{"home":{"homename":"KFC Komarno","homepoint":"1"},"away":{"awayname":"Podbrezova","awaypoint":"0"}}],
    
    [{"home":{"homename":"Kazicbarcika","homepoint":"0"},"away":{"awayname":"Soroksar","awaypoint":"1"}},
{"home":{"homename":"Szentlőrinc","homepoint":"0"},"away":{"awayname":"Ajka","awaypoint":"1"}}]
    ]
    


   var array2 = [
    [{"home":{"homename":"KFC Komarno","homepoint":"1"},"away":{"awayname":"Podbrezova","awaypoint":"0"}}],
    
    [{"home":{"homename":"Kazicbarcika","homepoint":"0"},"away":{"awayname":"Soroksar","awaypoint":"1"}},
{"home":{"homename":"Szentlőrinc","homepoint":"1"},"away":{"awayname":"Ajka","awaypoint":"1"}}]
    ]
以下是脚本:

{"home":{"homename":"Szentlőrinc","homepoint":"1"},"away":{"awayname":"Ajka","awaypoint":"1"}}]

我错过了什么?有什么解决办法吗?请帮助

您永远不会比较子数组中的对象,而只比较整个数组本身,因此无法获得预期的结果

如果你只想得到改变了的对象内部的元素,而不是整个对象,你可以使用
reduce
(另一个公平的答案让我深受启发):

常量数组1=[
[
{
主页:{homename:“肯德基科马诺”,homepoint:“1”},
离开:{awayname:“Podbrezova”,awaypoint:“0”}
}
],
[
{
主页:{homename:“Kazicbarcika”,homepoint:“0”},
离开:{awayname:“Soroksar”,awaypoint:“1”}
},
{
主页:{homename:“Szentlőrinc”,homepoint:“0”},
离开:{awayname:“Ajka”,awaypoint:“1”}
}
]
];
常数数组2=[
[
{
主页:{homename:“肯德基科马诺”,homepoint:“1”},
离开:{awayname:“Podbrezova”,awaypoint:“0”}
}
],
[
{
主页:{homename:“Kazicbarcika”,homepoint:“0”},
离开:{awayname:“Soroksar”,awaypoint:“1”}
},
{
主页:{主页名称:“Szentlőrinc”,主页:“1”},
离开:{awayname:“Ajka”,awaypoint:“1”}
}
]
];
函数getChanges(oldArray、newArray){
返回newArray.reduce((acc、cur、index)=>{
if(cur.home.homepoint!==oldArray[index].home.homepoint){
acc=[…acc,{home:cur.home}];
}
if(cur.away.awaypoint!==oldArray[index].away.awaypoint){
acc=[…acc,{away:cur.away}];
}
返回acc;
}, []);
}
const goals=getChanges(array1.flat(),array2.flat());

console.log(目标)比较函数似乎太复杂了

一个解决方案是在新数组中循环游戏,并将每个游戏条目与旧数组中相应的条目进行比较。如果
homepoint
awaipoint
不同,我们应该过滤此游戏条目

  • 展平嵌套数组,使比较更容易
  • 过滤不匹配的游戏
  • 请参阅下面的代码片段,它使用了问题中提供的2个数组

    const flattedoldarray=array1.flat()
    const flattednewarray=array2.flat()
    函数过滤器更改名称(新数组、旧数组){
    返回newArray.filter((新游戏,索引)=>{
    const oldGame=oldArray[索引]
    return(newGame.home.homepoint!==oldGame.home.homepoint)| |(newGame.away.awaypoint!==oldGame.awaypoint)
    })
    }
    const changedGames=filterChangedGames(展平newarray,展平ldarray)
    

    PS:在此代码段中,Internet Explorer 11和一些旧浏览器不支持。如果您需要支持较旧的浏览器,请确保使用类似的代码转换器/编译器。

    您可以用一个不太复杂的数组来解释您的问题吗?第二个数组包含两个数组,它包含两个对象,而不是两个数组。因此,如果var array1=[[{data=0}]、[{data=0}、{data=0}]/////array2=[{data=0}]、[{data=1}、{data=0}]]脚本正在从array2返回[[{data=1},{data=0}]],因为{data=1}已更改,但它应该只返回{data=1},而不是包含此数组的整个对象。我应该如何更改函数以仅返回该数组?谢谢!我自己无法解决它(设i=0;i(设i=0;i
    但老实说,代码在这一点上变得非常难看。不管怎样,另一个答案给了我一个想法来做你想做的事,我会编辑我的。我欠你一杯啤酒!非常感谢更新版本的Tanks,工作起来很有魅力!理论上你认为,数据越大,哪个函数速度越快?不客气!最好不要使用JSON.stringify用于比较对象/数组,因为对象键的顺序不是100%保证的。在使用JSON.stringify时,“{a:1,b:2}”不等于“{b:2,a:1}”。为了提高性能,这取决于。JSON.stringify对大型对象/数组的处理速度可能比在数组上循环并比较某些值(例如,hompoint和awaypoint)慢得多。本例中的性能似乎微不足道。对我个人来说,代码的可读性在本例中更为重要。我个人认为此解决方案比使用JSON.stringify的嵌套循环更具可读性。好的,我得到了:D解决方案,仅返回团队,代码中的更改点是可能的?没有som,这是不可能的添加到阵列中的游戏中。您是否有后端应用程序,或者这是一个仅限前端的应用程序?对于我想到的解决方案,游戏应该有一个唯一的ID。
    getChanges = function(oldArray, newArray) {
        var changes, i, item, j, len;
        if (JSON.stringify(oldArray) === JSON.stringify(newArray)) {
          return false;
        }
        changes = [];
        for (i = j = 0, len = newArray.length; j < len; i = ++j) {
          item = newArray[i];
          if (JSON.stringify(item) !== JSON.stringify(oldArray[i])) {
            changes.push(item);
          }
        }
        return changes;
      };
      var goals = getChanges(array1, array2);
      if (goals.length > 0) {
        console.log(goals);}
    
    [{"home":{"homename":"Kazicbarcika","homepoint":"0"},"away":{"awayname":"Soroksar","awaypoint":"1"}},{"home":{"homename":"Szentlőrinc","homepoint":"1"},"away":{"awayname":"Ajka","awaypoint":"1"}}]