Object comparison in JavaScript is deceptively complex. While comparing primitive values like numbers and strings is straightforward, comparing objects can lead to unexpected results. Let's explore different approaches to object comparison and build a robust solution for detecting changes between objects.
When developers first encounter object comparison in JavaScript, they often try something like this:
const user1 = { name: "John", age: 30 }; const user2 = { name: "John", age: 30 }; console.log(user1 === user2); // false
Surprisingly, this returns false even though both objects have identical content. This happens because JavaScript compares object references, not their values. Both objects point to different locations in memory.
A quick way to compare objects is using JSON.stringify:
const areEqual = (obj1, obj2) => JSON.stringify(obj1) === JSON.stringify(obj2); console.log(areEqual(user1, user2)); // true
While this works for simple cases, it has limitations:
Let's create a more sophisticated solution that not only detects differences but also tells us what changed:
function getObjectDiff(original, current) { const changes = {}; // Check current object's properties for (const [key, value] of Object.entries(current)) { if (!(key in original)) { changes[key] = { oldValue: undefined, newValue: value }; continue; } const originalValue = original[key]; const currentValue = value; // Handle different types of comparisons if ( originalValue !== currentValue && String(originalValue) !== String(currentValue) && JSON.stringify(originalValue) !== JSON.stringify(currentValue) ) { changes[key] = { oldValue: originalValue, newValue: currentValue }; } } // Check for removed properties for (const key of Object.keys(original)) { if (!(key in current)) { changes[key] = { oldValue: original[key], newValue: undefined }; } } return Object.keys(changes).length === 0 ? null : changes; }
This implementation:
This type of object comparison is particularly useful for:
const originalForm = { name: "John", email: "john@example.com" }; const currentForm = { name: "John", email: "john.doe@example.com" }; console.log(getObjectDiff(originalForm, currentForm)); // Output: { email: { oldValue: "john@example.com", newValue: "john.doe@example.com" } }
PS: Here's a Github gist for a simple function to compare and get the difference between two objects:
The above is the detailed content of How to Compare (diff) two Objects. For more information, please follow other related articles on the PHP Chinese website!