Masalah:
Anda perlu membandingkan dua objek bersarang dalam (Obj lama dan Obj baru ) dan kenal pasti perbezaan antara mereka, termasuk perubahan, penambahan dan pemadaman. Cabarannya terletak pada mewakili perbezaan ini dengan cara yang bermakna dan boleh bersiri JSON, terutamanya apabila tatasusunan terlibat.
Penyelesaian:
Mencipta Perbezaan Dalam Generik Algoritma:
Pertimbangkan untuk membangunkan kaedah generikDeepDiffBetweenObjects yang mengembalikan objek dalam bentuk {add: {...}, upd: {...}, del: {...}}. Ini akan memberikan gambaran asas perubahan.
Perwakilan Data Yang Diperbaiki:
Untuk pendekatan yang lebih komprehensif, pertimbangkan untuk menggunakan struktur objek yang sama seperti newObj tetapi menukar semua sifat nilai ke dalam objek dalam bentuk {type:
Mengendalikan Perbandingan Tatasusunan:
Tatasusunan memberikan cabaran yang unik kerana keperluan untuk mempertimbangkan susunan unsur untuk kesaksamaan. Penyelesaian yang canggih akan menganggap tatasusunan jenis berasaskan nilai seperti rentetan, integer dan boolean sebagai sama tanpa mengira susunan. Walau bagaimanapun, tatasusunan jenis rujukan seperti objek dan tatasusunan memerlukan logik perbandingan yang lebih kompleks.
Contoh Pelaksanaan:
Berikut ialah coretan kelas yang melaksanakan algoritma yang dicadangkan dan boleh disesuaikan untuk mengendalikan keperluan perbandingan nilai yang berbeza:
var deepDiffMapper = { VALUE_CREATED: 'created', VALUE_UPDATED: 'updated', VALUE_DELETED: 'deleted', VALUE_UNCHANGED: 'unchanged', map: function(obj1, obj2) { if (this.isFunction(obj1) || this.isFunction(obj2)) { throw 'Invalid argument. Function given, object expected.'; } if (this.isValue(obj1) || this.isValue(obj2)) { return { type: this.compareValues(obj1, obj2), data: obj1 === undefined ? obj2 : obj1 }; } ... }, ... };
Contoh Penggunaan:
var result = deepDiffMapper.map({ a: 'i am unchanged', b: 'i am deleted', ... }, { a: 'i am unchanged', c: 'i am created', ... }); console.log(result);
Kesimpulan:
Pendekatan ini menyediakan cara yang teguh dan boleh disesuaikan untuk melakukan perbandingan objek dalam dan mewakili perbezaan dengan cara yang jelas dan boleh bersiri JSON. Ia boleh diperluaskan untuk mengendalikan keperluan perbandingan nilai yang lebih kompleks atau format perwakilan data alternatif mengikut keperluan.
Atas ialah kandungan terperinci Bagaimana untuk Melakukan Perbandingan dan Transformasi Objek Dalam dalam JavaScript?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!