Tengo dos objetos x,y y quiero comparar ambos excluyendo una de las claves "c"
let x = {a: 5, b: 6, c: "string"} let y = {a: 5, b: 8, c: "string"}Cómo estoy tratando de compararlo es:
JSON.stringify(x) === JSON.stringify(y)Lo anterior funciona, pero comparará todas las claves que quiero excluir c en comparación aquí. ¿Cuál es la mejor manera de lograr esto?
El siguiente código obtiene todas las claves del objeto x , elimina c de la lista y luego realiza la comparación.
let x = { a: 5, b: 6, c: "string" }; let y = { a: 5, b: 6, c: "another string" }; console.log( Object.keys(x) .filter((key) => key !== "c") .every((key) => x[key] === y[key]) );array.sort requiere una función de comparator . Puedes usar exactamente lo mismo aquí
function myObjComparator (x, y) { if (xa != ya) return ya - xa; return yb - xb; }En general, NO encadenaría objetos para compararlos. La razón es bastante simple y es que DEBE asegurarse de que el orden de los miembros sea el mismo, de lo contrario, el resultado no será correcto.
Ex:
// objects are equals const y = { a: '1', b: '2' } const x = { b: '2', b: '1' } // but result is not what you expect JSON.stringify(x) === JSON.stringify(y) // falsePero, si puedes asegurarte de que el orden de los miembros sea siempre el mismo, stringify es rápido y una buena opción.
Puede usar la sintaxis extendida para evitar la propiedad "c"
const remappedX = { ...x, c: undefined }; const remappedY = { ...y, c: undefined }; JSON.stringify(remappedX) === JSON.stringify(remappedY); // trueO alternativamente
const allowedKeys = Object.keys(x).filter((k) => k !== 'c'); JSON.stringify(x, allowedKeys) === JSON.stringify(y, allowedKeys);El método más genérico es recorrer la tecla Objeto o, alternativamente, las entradas.
for(const key of Object.keys(x)) { if (key === 'c') { continue; } if (x[key] !== y[key]) { return false; } } return true;Pero, si su objeto está anidado, necesita usar un algoritmo de igualdad profunda, que por supuesto es más lento.
Aquí se ha dado una respuesta más genérica.