2015-06-29 2 views
0

Мне нужно проверить, имеют ли два объекта общие под-объекты. От common Я имею в виду, что это точное значение, а не только равные значения.Проверьте, есть ли у двух объектов общие под-объекты

Что-то вроде:

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

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

мне нужно проверить большие объекты, поэтому функция должна быть разумной эффективной. Также я не могу изменить объекты, поэтому я не могу пометить под-объекты со специальным свойством. Объекты создаются в сторонней библиотеке, поэтому я не могу изменить Object.prototype.

Идеальное решение - получить идентификатор для каждого объекта и сохранить его в коллекции, которая поддерживает быстрый поиск.

Могу ли я сделать такую ​​функцию в JS?

+1

, так что вы хотите сравнить самый глубокий предмет/значение друг с другом? – depperm

+0

Не только самый глубокий, мне нужно определить общие значения на любом уровне. –

+0

Почему второй hasCommonObjects возвращает false? – depperm

ответ

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>

Примечание: Вы должны добавить hasOwnProperty() фильтр в каждом цикле for..in, если вы хотите, чтобы исключить наследственные свойства; см. for..in and hasOwnProperty.

Смежные вопросы