JS - 查找属性数量未知的 2 个对象数组之间的差异

JS - finding differene between 2 arrays of objects with unknown number of properties

我有 2 个包含相同属性的对象数组,但根据情况它们可以有 1-50 个属性。我需要区分这 2

数组 1:

[
  {
    "prop1": 1,
    "prop2": 2
  },
  {
    "prop1": 4,
    "prop2": 4
  },
  {
    "prop1": 3,
    "prop2": 7
  },
  {
    "prop1": 1,
    "prop2": 3
  }
]

数组 2:

[
  {
    "prop1": 1,
    "prop2": 2
  },
  {
    "prop1": 4,
    "prop2": 4
  }
]

我尝试使用下划线的差异函数,但在这种情况下效果不佳。我正在考虑获取对象键,对其进行排序并散列我可以比较的 objects.That 但我需要将其恢复为原始格式。而且由于这些数组最多可以有 5000 个对象,所以看起来很昂贵。

有没有有效的解决办法?

编辑:我看到了问题 Difference between two array of objects in JavaScript,但该示例具有静态数量的属性,他可以根据这些属性过滤数组。事实并非如此;我不知道名字,也不知道房产数量。

您可以使用一些哈希表,先获取键,然后获取值,然后检查另一个数组的哈希并过滤结果。

本提案returns两个数组的对称差异

function getDifference(a, b) {
    function getKeyValue(object) {
        var keys = Object.keys(object).sort();
        return {
            key: keys.join('|'),
            value: keys.map(function (k) { return object[k]; }).join('|')
        };
    }

    function setHash(hash, kv) {
        hash[kv.key] = hash[kv.key] || {};
        hash[kv.key][kv.value] = true;
    }

    function isHash(hash, kv) {
        return hash[kv.key] && hash[kv.key][kv.value];
    }

    var hashA = Object.create(null),
        hashB = Object.create(null),
        result;

    b.forEach(function (o) {
        var kv = getKeyValue(o);
        setHash(hashB, kv);
    });

    return Array.prototype.concat(
        [],
        array1.filter(function (o) {
            var kv = getKeyValue(o);
            setHash(hashA, kv);
            return !isHash(hashB, kv);
        }),
        array2.filter(function (o) {
            var kv = getKeyValue(o);
            return !isHash(hashA, kv);
        })
    );
}

var array1 = [{ prop1: 1, prop2: 2 }, { prop1: 4, prop2: 4 }, { prop1: 3, prop2: 7 }, { prop1: 1, prop2: 3 }, { prop2: 3 }],
    array2 = [{ prop1: 1, prop2: 2 }, { prop1: 4, prop2: 4 }, { prop1: 4 }];

console.log(getDifference(array1, array2));
.as-console-wrapper { max-height: 100% !important; top: 0; }