Dado que tengo dos objetos, ¿cuál es la forma más sencilla de comparar si tienen al menos una propiedad que coincida ( alguna o alguna )? No busco una coincidencia completa de un objeto A completo dentro del objeto B, sino una coincidencia del objeto A parcial dentro del objeto B.
{ name: "John", age: 23, city: "London" } // and { name: "Craig", age: 47, city: "London" } // returns true { name: "Adrian", age: 32, city: "Sofia" } // and { name: "Tom", age: 44, city: "Oslo" } // returns falseHe probado varias funciones de coincidencia parcial con lodash (isMatch), pero parecen realizar coincidencias de todos con algunos o de todos con todos, mientras que yo busco algunos con algunos.
Si simplemente está comprobando si tienen algo en común:
const john = { name: "John", age: 23, city: "London" } const craig = { name: "Craig", age: 47, city: "London" } const adrian = { name: "Adrian", age: 32, city: "Sofia" } const tom = { name: "Tom", age: 44, city: "Oslo" } function hasAnythingInCommon(obj1, obj2) { for (const key in obj1) { if(obj1[key] === obj2[key]) return true } return false } console.log(hasAnythingInCommon(john, craig)) console.log(hasAnythingInCommon(adrian, tom))Breve explicación:
for (const key in obj1) : Recorre todas las claves en el primer objeto.if(obj1[key] === obj2[key]) return true : si los dos objetos coinciden en el valor que tienen en una de estas claves, devuelve true inmediatamente.return false : si pasa por todo el ciclo sin devolver true , entonces no tienen nada en común y devolvemos false .La forma más fácil es simplemente enumerar todos los atributos como comparaciones:
const compare = (a, b) => a.name === b.name || a.age === b.age || a.city === b.city;Una versión más genérica sería:
const compare = (a, b) => Object.entries(a).some(([key, value]) => value === b[key]);