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
Lepaskan: 2024-11-15 12:58:02
asal
498 orang telah melayarinya

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:{...}}
Salin selepas log masuk

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>}
Salin selepas log masuk

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

returnObj.prop1 = {type: 'update', data: 'new value'}
Salin selepas log masuk

Mengendalikan Tatasusunan

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

[1,[{c: 1},2,3],{a:'hey'}]
Salin selepas log masuk

dan

[{a:'hey'},1,[3,{c: 1},2]]
Salin selepas log masuk

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;
    },
    ...
  }
}();
Salin selepas log masuk

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);
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan