Estoy buscando comparar claves en dos objetos. ¿Existe un método incorporado para hacer esto o una versión más corta de algo como lo siguiente?
// treat keys as enumerableOwn // 1. Difference: {}.keys() - {}.keys() Object.prototype.diff = function(obj2) { let thisKeys = Object.keys(this); let arr = []; for (let i=0; i < thisKeys.length; i++) { let key = thisKeys[i]; if (!(obj2.hasOwnProperty(key))) { arr.push(key); } } return arr; } // 2. Intersection: {}.keys() && {}.keys() Object.prototype.same = function(obj2) { let thisKeys = Object.keys(this); let arr = []; for (let i=0; i < thisKeys.length; i++) { let key = thisKeys[i]; if (obj2.hasOwnProperty(key)) { arr.push(key); } } return arr; } // 3. Union: {}.keys() || {}.keys() Object.prototype.union = function(obj2) { let arr = Object.keys(this); for (let key of Object.keys(obj2)) { if (!(obj1.hasOwnProperty(key))) { arr.push(key); } } return arr; } let obj1 = {x: 1, y: 2}; let obj2 = {x: 3, z: 4} console.log(obj1.diff(obj2)); console.log(obj1.same(obj2)); console.log(obj1.union(obj2));Una forma ligeramente diferente y más corta de hacerlo sería la siguiente:
function diff(obj1, obj2) { let keys = Object.keys(obj2); return Object.keys(obj1).filter((elem) => !keys.includes(elem)) }; function same(obj1, obj2) { let keys = Object.keys(obj2); return Object.keys(obj1).filter((elem) => keys.includes(elem)); } function union(obj1, obj2) { let keys = [...Object.keys(obj1), ...Object.keys(obj2)]; return Array.from(new Set(keys)); } let obj1 = {x: 1, y: 2}; let obj2 = {x: 3, z: 4} console.log(diff(obj1, obj2)); console.log(same(obj1, obj2)); console.log(union(obj1, obj2));