Если ключи и структуры объектов всегда совпадают, вы можете выполнить рекурсивную проверку ключей / значений:
const have = {
a: true,
b: {
c: true,
d: true
}
};
const need = {
a: false,
b: {
c: true,
d: false
}
};
function objectsHaveMatch(obj1, obj2) {
return Object.entries(obj1).some(([key, obj1Val]) => {
if (!obj2[key]) return false;
if (typeof obj1Val !== 'boolean') return objectsHaveMatch(obj1Val, obj2[key]);
return obj1Val === true && obj2[key] === true;
});
}
const atLeastOneMatch = objectsHaveMatch(have, need);
console.log(atLeastOneMatch);
Также работает с более сложными структурами:
const have = {
a: true,
b: {
c: false,
d: true,
foo: {
q: false,
w: false,
e: false,
r: {
t: true
}
}
}
};
const need = {
a: false,
b: {
c: true,
d: false,
foo: {
q: true,
w: true,
e: true,
r: {
t: false
}
}
}
};
function objectsHaveMatch(obj1, obj2) {
return Object.entries(obj1).some(([key, obj1Val]) => {
if (!obj2[key]) return false;
if (typeof obj1Val !== 'boolean') return objectsHaveMatch(obj1Val, obj2[key]);
return obj1Val === true && obj2[key] === true;
});
}
const atLeastOneMatch = objectsHaveMatch(have, need);
console.log(atLeastOneMatch);
Пример фрагмента с отсутствующими свойствами:
const have = {
a: true,
b: {
c: true,
d: true,
foo: {
q: false,
w: false,
e: false,
r: {
t: true
}
}
}
};
const need = {
b: {
c: true,
}
};
function objectsHaveMatch(obj1, obj2) {
return Object.entries(obj1).some(([key, obj1Val]) => {
if (!obj2[key]) return false;
if (typeof obj1Val !== 'boolean') return objectsHaveMatch(obj1Val, obj2[key]);
return obj1Val === true && obj2[key] === true;
});
}
const atLeastOneMatch = objectsHaveMatch(have, need);
console.log(atLeastOneMatch);