>웹 프론트엔드 >JS 튜토리얼 >JavaScript에서 객체 및 배열에 대한 일반 Deep Diff를 구현하는 방법은 무엇입니까?

JavaScript에서 객체 및 배열에 대한 일반 Deep Diff를 구현하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-15 12:58:02491검색

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

두 개체 간의 일반 심층 차이

두 개체의 심층 비교에는 추가, 업데이트, 삭제를 포함하여 개체 간의 변경 사항을 식별하는 작업이 포함됩니다. 이는 특히 중첩된 객체와 배열의 경우 복잡할 수 있습니다.

일반 심층 차이에 대한 기존 라이브러리 또는 코드

한 가지 접근 방식은 다음을 반환하는 일반 deepDiffBetweenObjects 메서드를 구현하는 것입니다. 변경 사항을 다음과 같이 나타내는 객체:

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

그러나 객체 구조 내의 업데이트를 캡처하려면 보다 세부적인 표현이 바람직합니다.

업데이트된 객체 구조를 사용하여 향상된 표현

향상된 표현은 업데이트된 객체(newObj)와 동일한 객체 구조를 사용하지만 속성 값을 객체로 변환합니다.

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

예를 들어 newObj.prop1 = 'new value' 및 oldObj인 경우입니다. prop1 = '이전 값'인 경우 결과는 다음과 같습니다.

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

배열 처리

동등성을 결정하는 것이 간단하지 않기 때문에 배열은 추가적인 복잡성을 가져옵니다. 예를 들어

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

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

배열은 동일한 것으로 간주되어야 합니다. 깊은 값 동일성은 확인하기 복잡할 수 있으며 배열 변경 사항을 효과적으로 나타내는 것도 어렵습니다.

샘플 구현

다음은 일반적인 심층 비교를 수행할 수 있는 클래스의 구현입니다. :

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;
    },
    ...
  }
}();

사용 예:

var result = deepDiffMapper.map({
  a: 'i am unchanged',
  b: 'i am deleted',
  ...
}, {
  a: 'i am unchanged',
  c: 'i am created',
  ...
});
console.log(result);

위 내용은 JavaScript에서 객체 및 배열에 대한 일반 Deep Diff를 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.