Perbandingan objek dalam JavaScript sangat rumit. Walaupun membandingkan nilai primitif seperti nombor dan rentetan adalah mudah, membandingkan objek boleh membawa kepada hasil yang tidak dijangka. Mari kita terokai pendekatan berbeza untuk perbandingan objek dan bina penyelesaian yang mantap untuk mengesan perubahan antara objek.
Apabila pembangun mula-mula menemui perbandingan objek dalam JavaScript, mereka sering mencuba sesuatu seperti ini:
const user1 = { name: "John", age: 30 }; const user2 = { name: "John", age: 30 }; console.log(user1 === user2); // false
Anehnya, ini mengembalikan palsu walaupun kedua-dua objek mempunyai kandungan yang sama. Ini berlaku kerana JavaScript membandingkan rujukan objek, bukan nilainya. Kedua-dua objek menghala ke lokasi yang berbeza dalam ingatan.
Cara cepat untuk membandingkan objek menggunakan JSON.stringify:
const areEqual = (obj1, obj2) => JSON.stringify(obj1) === JSON.stringify(obj2); console.log(areEqual(user1, user2)); // true
Walaupun ini berfungsi untuk kes mudah, ia mempunyai had:
Mari kita cipta penyelesaian yang lebih canggih yang bukan sahaja mengesan perbezaan tetapi juga memberitahu kita perkara yang berubah:
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; }
Pelaksanaan ini:
Jenis perbandingan objek ini amat berguna untuk:
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: Inilah intipati Github untuk fungsi mudah untuk membandingkan dan mendapatkan perbezaan antara dua objek:
Atas ialah kandungan terperinci Cara Membandingkan (berbeza) dua Objek. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!