首頁  >  文章  >  web前端  >  如何有效地找到並表示兩個深度嵌套的 JavaScript 物件之間的深層差異?

如何有效地找到並表示兩個深度嵌套的 JavaScript 物件之間的深層差異?

Barbara Streisand
Barbara Streisand原創
2024-11-19 16:02:02605瀏覽

How can you effectively find and represent the deep differences between two deeply nested JavaScript objects?

找出兩個深層嵌套物件之間的差異

問題:計算兩個深層嵌套JavaScript 物件之間的深層差異,結合表示技術來清楚了解識別變化。

詳細資料:給定兩個對象, oldObj 和 newObj,需要自訂 diff 演算法來確定它們之間的差異,包括值、結構和陣列順序的變化。輸出應以清晰且可 JSON 序列化的方式表示。

解決方案:

自訂類別deepDiffMapper 旨在解決此問題問題:

var deepDiffMapper = function () {
  return {

    // Constants representing change types
    VALUE_CREATED: 'created',
    VALUE_UPDATED: 'updated',
    VALUE_DELETED: 'deleted',
    VALUE_UNCHANGED: 'unchanged',

    map: function(obj1, obj2) {
      // Algorithm for comparing objects

      return diff;
    },
    
    compareValues: function (value1, value2) {
      // Logic for determining value changes
      
      return result;
    },

    // Helper functions to identify object types
    ...
  }
}();

用法:

用法:
var result = deepDiffMapper.map(oldObj, newObj);

用法:

    用法:
  • 要使用此類,只需以兩個物件作為參數呼叫map 方法:

輸出:

map 方法傳回一個表示兩個輸入物件之間的差異。該物件的鍵對應於 newObj 中的屬性。每個值本身都是一個具有以下屬性的物件:

var oldObj = {
  a: 'i am unchanged',
  b: 'i am deleted',
  e: {
    a: 1,
    b: false,
    c: null
  },
  f: [1, {
    a: 'same',
    b: [{
      a: 'same'
    }, {
      d: 'delete'
    }]
  }],
  g: new Date('2017.11.25')
};

var newObj = {
  a: 'i am unchanged',
  c: 'i am created',
  e: {
    a: '1',
    b: '',
    d: 'created'
  },
  f: [{
    a: 'same',
    b: [{
      a: 'same'
    }, {
      c: 'create'
    }]
  }, 1],
  g: new Date('2017.11.25')
};

類型:更改的類型(建立、更新、刪除或未更改)

{
  b: {
    type: 'deleted',
    data: undefined
  },
  c: {
    type: 'created',
    data: 'i am created'
  },
  e: {
    a: {
      type: 'updated',
      data: '1'
    },
    b: {
      type: 'updated',
      data: ''
    },
    d: {
      type: 'created',
      data: 'created'
    }
  },
  f: {
    1: {
      type: 'deleted',
      data: undefined
    },
    2: {
      b: {
        1: {
          d: {
            type: 'deleted',
            data: undefined
          }
        },
        2: {
          c: {
            type: 'created',
            data: 'create'
          }
        }
      }
    }
  }
}
資料:更新或新值(如果有創作或update)

範例:給定下列輸入物件:map 方法將傳回以下表示差異:此表示清楚地顯示了對物件所做的更改,突出顯示建立、更新和刪除屬性。

以上是如何有效地找到並表示兩個深度嵌套的 JavaScript 物件之間的深層差異?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn