我需要检查两个对象是否有共同的子对象。 通过普通,我的意思是完全相同的值,而不仅仅是相等的值。
像:
function haveCommonObects(value1, value2) {
...
}
var common = {};
haveCommonObjects({a: common}, {b: {c: common}}) // true
haveCommonObjects({a: 1}, {b: 1}) // false
我需要检查大对象,因此功能应该合理有效。
此外,我无法更改对象,因此我无法标记具有特殊属性的子对象。对象在第三方库中创建,因此我无法更改Object.prototype
。
理想的解决方案是为每个对象获取某种ID,并将其保存在支持快速查找的集合中。
我可以在JS中创建这样的功能吗?
答案 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。