为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕码人2483693 2019-10-21 16:12:54
如何在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中可以这样做吗?
查看完整描述

3 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

只使用本机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);



查看完整回答
反对 回复 2019-10-22
?
波斯汪

TA贡献1811条经验 获得超4个赞

你可以用Array.prototype.filter()结合在一起Array.prototype.some().

下面是一个示例(假设数组存储在变量中)result1result2):

//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);



查看完整回答
反对 回复 2019-10-22
?
万千封印

TA贡献1891条经验 获得超3个赞

我采取的是一种稍微通用的方法,尽管在思想上与两者的方法相似。@Cerbrus@Kasper Moerch..我创建了一个接受谓词的函数来确定两个对象是否相等(这里我们忽略了$$hashKey属性,但它可以是任何内容)并返回一个函数,该函数根据该谓词计算两个列表的对称差异:

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"}]var 
 makeSymmDiffFunc = (function() {
    var contains = function(pred, a, list) {
        var idx = -1, len = list.length;
        while (++idx < len) {if (pred(a, list[idx])) {return true;}}
        return false;
    };
    var complement = function(pred, a, b) {
        return a.filter(function(elem) {return !contains(pred, elem, b);});
    };
    return function(pred) {
        return function(a, b) {
            return complement(pred, a, b).concat(complement(pred, b, a));
        };
    };}());var myDiff = makeSymmDiffFunc(function(x, y) {
    return x.value === y.value && x.display === y.display;});var result = myDiff(a, b);
     //=>  {value="a63a6f77-c637-454e-abf2-dfb9b543af6c", display="Ryan"}

与Cerebrus的方法相比,它有一个小的优势(如同KasperMoerch的方法一样),因为它提前逃脱;如果它找到了匹配的,它就不会去检查列表的其余部分。如果我有一个curry函数HANDY,我会做一些不同的,但这是很好的工作。

解释

一条评论要求为初学者提供更详细的解释。这是一次尝试。

我们将以下函数传递给makeSymmDiffFunc:

function(x, y) {
    return x.value === y.value && x.display === y.display;}

这个函数是如何决定两个对象是相等的。就像所有返回的函数一样truefalse,它可以被称为“谓词函数”,但这只是术语而已。重点是makeSymmDiffFunc配置为一个函数,该函数接受两个对象并返回true如果我们认为它们是平等的,false如果我们不这么做。

用这个,makeSymmDiffFunc(阅读“制造对称差分函数”)返回一个新函数:

        return function(a, b) {
            return complement(pred, a, b).concat(complement(pred, b, a));
        };

这是我们将实际使用的函数。我们传递给它两个列表,它在第一个列表中找到元素,然后在第二个列表中找到元素,然后在第一个列表中找到元素,然后将这两个列表组合在一起。

不过,再看一遍,我肯定会从您的代码中得到提示,并通过以下方法对主函数进行相当大的简化some:

var makeSymmDiffFunc = (function() {
    var complement = function(pred, a, b) {
        return a.filter(function(x) {
            return !b.some(function(y) {return pred(x, y);});
        });
    };
    return function(pred) {
        return function(a, b) {
            return complement(pred, a, b).concat(complement(pred, b, a));
        };
    };}());

complement使用谓词并返回第一个列表中的元素,而不是第二个列表中的元素。这比我第一次单独通过contains功能。

最后,主函数包装在一个立即调用的函数表达式中(生命)保持内部complement在全球范围之外发挥作用。


更新,几年后

既然ES 2015已经变得相当普及,我建议采用同样的技术,少得多的样板:

const diffBy = (pred) => (a, b) => a.filter(x => !b.some(y => pred(x, y)))const makeSymmDiffFunc = (pred) => (a, b) => 
diffBy(pred)(a, b).concat(diffBy(pred)(b, a))const myDiff = makeSymmDiffFunc((x, y) => x.value === y.value && x.display 
=== y.display)const result = myDiff(a, b)//=>  {value="a63a6f77-c637-454e-abf2-dfb9b543af6c", display="Ryan"}



查看完整回答
反对 回复 2019-10-22
  • 3 回答
  • 0 关注
  • 410 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信