检查两个对象是否具有公共子对象

时间:2015-06-29 20:24:03

标签: javascript

我需要检查两个对象是否有共同的子对象。 通过普通,我的意思是完全相同的值,而不仅仅是相等的值。

像:     

function haveCommonObects(value1, value2) {
  ...
}

var common = {};
haveCommonObjects({a: common}, {b: {c: common}}) // true
haveCommonObjects({a: 1}, {b: 1}) // false

我需要检查大对象,因此功能应该合理有效。 此外,我无法更改对象,因此我无法标记具有特殊属性的子对象。对象在第三方库中创建,因此我无法更改Object.prototype

理想的解决方案是为每个对象获取某种ID,并将其保存在支持快速查找的集合中。

我可以在JS中创建这样的功能吗?

1 个答案:

答案 0 :(得分:1)

以下是我将如何做到这一点:

function haveCommonObjects(a,b) {
    // check if a and b have any object in common, at any depth level
    if (typeof(a) !== 'object' || typeof(b) !== 'object') return false;
    for (var key in a) {
        var o = a[key];
        if (typeof(o) === 'object' && (hasObject(b,o) || haveCommonObjects(o,b)))
            return true;
    }
    return false;
}
function hasObject(x,t) {
    // check if x has a reference to object t, at any depth level
    for (var key in x) {
        var o = x[key];
        if (typeof(o) === 'object' && (o === t || hasObject(o,t)))
            return true;
    }
    return false;
}
function log(msg) { document.getElementById('log').innerHTML += msg+'<br/>'; }

var common = {};
log(haveCommonObjects({a: common}, {b: {c: common}})); // true
log(haveCommonObjects({a: 1}, {b: 1})); // false
<div id="log"></div>

注意:如果要排除继承的属性,则应在每个for..in循环中添加hasOwnProperty()过滤器;见for..in and hasOwnProperty