Rumah >hujung hadapan web >tutorial js >Bagaimana untuk Melaksanakan Perbezaan Dalam Generik untuk Objek dan Tatasusunan dalam JavaScript?

Bagaimana untuk Melaksanakan Perbezaan Dalam Generik untuk Objek dan Tatasusunan dalam JavaScript?

Barbara Streisand
Barbara Streisandasal
2024-11-15 12:58:02492semak imbas

How to Implement a Generic Deep Diff for Objects and Arrays in JavaScript?

Beza Dalam Generik Antara Dua Objek

Beza mendalam dua objek melibatkan mengenal pasti perubahan antara objek tersebut, termasuk penambahan, kemas kini dan pemadaman. Ini boleh menjadi rumit, terutamanya untuk objek dan tatasusunan bersarang.

Perpustakaan Sedia Ada atau Kod untuk Generik Deep Diff

Satu pendekatan ialah melaksanakan kaedah generik deepDiffBetweenObjects yang mengembalikan objek yang menunjukkan perubahan sebagai:

{add:{...},upd:{...},del:{...}}

Walau bagaimanapun, perwakilan yang lebih berbutir ialah wajar untuk menangkap kemas kini dalam struktur objek.

Perwakilan Dipertingkatkan Menggunakan Struktur Objek Dikemaskini

Perwakilan yang dipertingkat menggunakan struktur objek yang sama seperti objek yang dikemas kini (newObj) tetapi berubah nilai harta ke dalam objek:

{type: '<update|create|delete>', data: <propertyValue>}

Sebagai contoh, jika newObj.prop1 = 'nilai baru' dan oldObj.prop1 = 'nilai lama', hasilnya ialah:

returnObj.prop1 = {type: 'update', data: 'new value'}

Mengendalikan Tatasusunan

Susunatur memperkenalkan kerumitan tambahan , kerana menentukan kesetaraan adalah tidak mudah. Contohnya, tatasusunan:

[1,[{c: 1},2,3],{a:'hey'}]

dan

[{a:'hey'},1,[3,{c: 1},2]]

hendaklah dianggap sama. Kesaksamaan nilai dalam boleh menjadi rumit untuk diperiksa dan mewakili perubahan tatasusunan secara berkesan juga mencabar.

Sampel Pelaksanaan

Berikut ialah pelaksanaan kelas yang boleh melakukan perbezaan dalam generik :

var deepDiffMapper = function () {
  return {
    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
        };
      }

      var diff = {};
      for (var key in obj1) {
        if (this.isFunction(obj1[key])) {
          continue;
        }

        var value2 = undefined;
        if (obj2[key] !== undefined) {
          value2 = obj2[key];
        }

        diff[key] = this.map(obj1[key], value2);
      }
      for (var key in obj2) {
        if (this.isFunction(obj2[key]) || diff[key] !== undefined) {
          continue;
        }

        diff[key] = this.map(undefined, obj2[key]);
      }

      return diff;

    },
    compareValues: function (value1, value2) {
      if (value1 === value2) {
        return this.VALUE_UNCHANGED;
      }
      if (this.isDate(value1) &amp;&amp; this.isDate(value2) &amp;&amp; value1.getTime() === value2.getTime()) {
        return this.VALUE_UNCHANGED;
      }
      if (value1 === undefined) {
        return this.VALUE_CREATED;
      }
      if (value2 === undefined) {
        return this.VALUE_DELETED;
      }
      return this.VALUE_UPDATED;
    },
    ...
  }
}();

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);

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Perbezaan Dalam Generik untuk Objek dan Tatasusunan dalam JavaScript?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn