请问如何在JavaScript中获得两个对象数组之间的区别

如何在JavaScript中获得两个对象数组之间的区别

我有两个像这样的结果集:

// Result 1[
    { value="0", display="Jamsheer" },
    { value="1", display="Muhammed" },
    { value="2", display="Ravi" },
    { value="3", display="Ajmal" },
    { value="4", display="Ryan" }]// Result 2[
    { value="0", display="Jamsheer" },
    { value="1", display="Muhammed" },
    { value="2", display="Ravi" },
    { value="3", display="Ajmal" },]

我需要的最终结果是这些数组之间的区别-最终结果应该如下所示:

[{ value="4", display="Ryan" }]

在JavaScript中可以这样做吗?



慕码人2483693
浏览 418回答 3
3回答

精慕HU

只使用本机JS,这样的东西会起作用的:a = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal"},  { value:"a63a6f77-c637-454e-abf2-dfb9b543af6c", display:"Ryan"}]b = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer", $$hashKey:"008"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed", $$hashKey:"009"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi", $$hashKey:"00A"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal", $$hashKey:"00B"}]function comparer(otherArray){  return function(current){    return otherArray.filter(function(other){      return other.value == current.value && other.display == current.display    }).length == 0;  }}var onlyInA = a.filter(comparer(b));var onlyInB = b.filter(comparer(a));result = onlyInA.concat(onlyInB);console.log(result);

波斯汪

你可以用Array.prototype.filter()结合在一起Array.prototype.some().下面是一个示例(假设数组存储在变量中)result1和result2)://Find values that are in result1 but not in result2var uniqueResultOne = result1.filter(function(obj) {     return !result2.some(function(obj2) {         return obj.value == obj2.value;     });});//Find values that are in result2 but not in result1var uniqueResultTwo = result2.filter(function(obj) {     return !result1.some(function(obj2) {         return obj.value == obj2.value;     });});//Combine the two arrays of unique entriesvar result = uniqueResultOne.concat(uniqueResultTwo);

万千封印

我采取的是一种稍微通用的方法,尽管在思想上与两者的方法相似。@Cerbrus和@Kasper Moerch..我创建了一个接受谓词的函数来确定两个对象是否相等(这里我们忽略了$$hashKey属性,但它可以是任何内容)并返回一个函数,该函数根据该谓词计算两个列表的对称差异:a&nbsp;=&nbsp;[{&nbsp;value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642",&nbsp;display:"Jamsheer"},&nbsp;{&nbsp;value:"644838b3-604d-4899-8b78-09e4799f586f",&nbsp;display:"Muhammed"} ,&nbsp;{&nbsp;value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d",&nbsp;display:"Ravi"},&nbsp;{&nbsp;value:"e97339e1-939d-47ab-974c-1b68c9cfb536",&nbsp;display:"Ajmal"},&nbsp;&nbsp; {&nbsp;value:"a63a6f77-c637-454e-abf2-dfb9b543af6c",&nbsp;display:"Ryan"}]b&nbsp;=&nbsp;[{&nbsp;value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642",&nbsp;display:"Jamsheer", &nbsp;$$hashKey:"008"},&nbsp;{&nbsp;value:"644838b3-604d-4899-8b78-09e4799f586f",&nbsp;display:"Muhammed",&nbsp;$$hashKey:"009"},&nbsp;{&nbsp;value:"b6ee537a-375c-45bd-b9d4- &nbsp;4dd84a75041d",&nbsp;display:"Ravi",&nbsp;$$hashKey:"00A"},&nbsp;{&nbsp;value:"e97339e1-939d-47ab-974c-1b68c9cfb536",&nbsp;display:"Ajmal",&nbsp;$$hashKey:"00B"}]var&nbsp; &nbsp;makeSymmDiffFunc&nbsp;=&nbsp;(function()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;contains&nbsp;=&nbsp;function(pred,&nbsp;a,&nbsp;list)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;idx&nbsp;=&nbsp;-1,&nbsp;len&nbsp;=&nbsp;list.length; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(++idx&nbsp;<&nbsp;len)&nbsp;{if&nbsp;(pred(a,&nbsp;list[idx]))&nbsp;{return&nbsp;true;}} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;complement&nbsp;=&nbsp;function(pred,&nbsp;a,&nbsp;b)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;a.filter(function(elem)&nbsp;{return&nbsp;!contains(pred,&nbsp;elem,&nbsp;b);}); &nbsp;&nbsp;&nbsp;&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;function(pred)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;function(a,&nbsp;b)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;complement(pred,&nbsp;a,&nbsp;b).concat(complement(pred,&nbsp;b,&nbsp;a)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;};}());var&nbsp;myDiff&nbsp;=&nbsp;makeSymmDiffFunc(function(x,&nbsp;y)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;x.value&nbsp;===&nbsp;y.value&nbsp;&&&nbsp;x.display&nbsp;===&nbsp;y.display;});var&nbsp;result&nbsp;=&nbsp;myDiff(a,&nbsp;b); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//=>&nbsp;&nbsp;{value="a63a6f77-c637-454e-abf2-dfb9b543af6c",&nbsp;display="Ryan"}与Cerebrus的方法相比,它有一个小的优势(如同KasperMoerch的方法一样),因为它提前逃脱;如果它找到了匹配的,它就不会去检查列表的其余部分。如果我有一个curry函数HANDY,我会做一些不同的,但这是很好的工作。解释一条评论要求为初学者提供更详细的解释。这是一次尝试。我们将以下函数传递给makeSymmDiffFunc:function(x,&nbsp;y)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;x.value&nbsp;===&nbsp;y.value&nbsp;&&&nbsp;x.display&nbsp;===&nbsp;y.display;}这个函数是如何决定两个对象是相等的。就像所有返回的函数一样true或false,它可以被称为“谓词函数”,但这只是术语而已。重点是makeSymmDiffFunc配置为一个函数,该函数接受两个对象并返回true如果我们认为它们是平等的,false如果我们不这么做。用这个,makeSymmDiffFunc(阅读“制造对称差分函数”)返回一个新函数:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;function(a,&nbsp;b)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;complement(pred,&nbsp;a,&nbsp;b).concat(complement(pred,&nbsp;b,&nbsp;a)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};这是我们将实际使用的函数。我们传递给它两个列表,它在第一个列表中找到元素,然后在第二个列表中找到元素,然后在第一个列表中找到元素,然后将这两个列表组合在一起。不过,再看一遍,我肯定会从您的代码中得到提示,并通过以下方法对主函数进行相当大的简化some:var&nbsp;makeSymmDiffFunc&nbsp;=&nbsp;(function()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;complement&nbsp;=&nbsp;function(pred,&nbsp;a,&nbsp;b)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;a.filter(function(x)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;!b.some(function(y)&nbsp;{return&nbsp;pred(x,&nbsp;y);}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;function(pred)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;function(a,&nbsp;b)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;complement(pred,&nbsp;a,&nbsp;b).concat(complement(pred,&nbsp;b,&nbsp;a)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;};}());complement使用谓词并返回第一个列表中的元素,而不是第二个列表中的元素。这比我第一次单独通过contains功能。最后,主函数包装在一个立即调用的函数表达式中(生命)保持内部complement在全球范围之外发挥作用。更新,几年后既然ES 2015已经变得相当普及,我建议采用同样的技术,少得多的样板:const&nbsp;diffBy&nbsp;=&nbsp;(pred)&nbsp;=>&nbsp;(a,&nbsp;b)&nbsp;=>&nbsp;a.filter(x&nbsp;=>&nbsp;!b.some(y&nbsp;=>&nbsp;pred(x,&nbsp;y)))const&nbsp;makeSymmDiffFunc&nbsp;=&nbsp;(pred)&nbsp;=>&nbsp;(a,&nbsp;b)&nbsp;=>&nbsp; diffBy(pred)(a,&nbsp;b).concat(diffBy(pred)(b,&nbsp;a))const&nbsp;myDiff&nbsp;=&nbsp;makeSymmDiffFunc((x,&nbsp;y)&nbsp;=>&nbsp;x.value&nbsp;===&nbsp;y.value&nbsp;&&&nbsp;x.display&nbsp; ===&nbsp;y.display)const&nbsp;result&nbsp;=&nbsp;myDiff(a,&nbsp;b)//=>&nbsp;&nbsp;{value="a63a6f77-c637-454e-abf2-dfb9b543af6c",&nbsp;display="Ryan"}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript