Вы можете использовать Карту и Объект, подсчитать вхождение пользователя для каждого свойства, если оно равно длине массива, тогда есть хотя бы одно свойство, которое встречается у всех пользователей
let matcher = (arr) => {
let mapper = {}
arr.forEach(v => {
let { user, properties } = v
properties.forEach(v => {
if (mapper[v]) {
mapper[v].set(user, (mapper[v].get(user) || 0) + 1)
} else {
mapper[v] = new Map()
mapper[v].set(user, 1)
}
})
})
return Object.entries(mapper).some(([_, v]) => {
let total = [...v].reduce((a, [_, b]) => a + b, 0)
return total === arr.length
})
}
let arr = [{user: 'jane',properties: ['prop1', 'prop2']}, {user: 'bob',properties: ['prop1', 'prop4']}, {user: 'dave',properties: ['prop1', 'prop2', 'prop3']}, {user: 'tim',properties: ['prop4', 'prop2', 'prop3']}];
console.log(matcher(arr))
let arr2 = [{user: 'jane',properties: ['prop1', 'prop2']},{user: 'bob',properties: ['prop1', 'prop4']}]
console.log(matcher(arr2))