자바 스크립트에서 객체 배열 비교
-
09-06-2019 - |
문제
자바 스크립트 코드에서 2 개의 객체 배열을 비교하고 싶습니다.개체에는 총 8 개의 속성이 있지만 각 개체에는 각각에 대한 값이 없으며 배열은 각각 8 개 항목보다 크지 않을 것입니다.8 개의 속성은 내가하고 싶은 일을하는 가장 쉬운 방법이지만, 구현하기 전에 누군가가 더 우아한 솔루션을 가지고 있는지보고 싶었습니다.어떤 생각?
해결책
편집 : JavaScript 인터프리터의 현재 일반적인 브라우저 기반 구현에서 연산자를 오버로드 할 수 없습니다.
원래의 질문에 답하기 위해이 작업을 수행 할 수있는 한 가지 방법은 약간의 해킹입니다. 두 배열을 JSON으로 직렬화 한 다음 두 JSON 문자열을 비교합니다. 이는 단순히 배열이 다른지 여부를 알려줍니다. 분명히 배열 내의 객체 각 에 대해이 작업을 수행하여 어떤 것이 다른지 확인할 수 있습니다.
또 다른 옵션은 객체 비교를위한 멋진 기능이있는 라이브러리를 사용하는 것입니다. MochiKit <을 사용하고 권장합니다. / strong> . <시간>
다음은 사용자에게 충분할 수있는 순진한 구현입니다.이 구현에는 잠재적 인 문제가 있음을 유의하세요. 라코 디스
다른 팁
이것이 오래된 질문이고 제공된 답변이 잘 작동한다는 것을 알고 있습니다 ... 그러나 이것은 조금 더 짧고 추가 라이브러리 (예 : JSON)가 필요하지 않습니다. 라코 디스
솔직히, 최대 8 개의 개체와 개체 당 최대 8 개의 속성을 사용하는 경우 가장 좋은 방법은 각 개체를 가로 질러 직접 비교하는 것입니다.빠르고 쉬울 것입니다.
이러한 유형의 비교를 자주 사용한다면 JSON 직렬화에 대해 Jason의 의견에 동의합니다. 그렇지 않으면 새 라이브러리 나 JSON 직렬화 코드로 앱 속도를 늦출 필요가 없습니다.
저는 두 개체의 내용을 비교하고 이해하기 쉬운 차이점 목록을 반환하기 위해 간단한 알고리즘을 약간 작업했습니다.내가 나눌 것이라고 생각했다.jQuery에 대한 몇 가지 아이디어, 즉 map
함수 구현과 객체 및 배열 유형 검사를 차용합니다.
Diff 정보가있는 배열 인 "diff 객체"목록을 반환합니다.매우 간단합니다.
여기 있습니다 : 라코 디스
나는 JSON.stringify()
를 시도하고 나를 위해 일했습니다.
라코 디스
일반적으로 직렬화가 작동하지 않기 때문에 (속성 순서가 일치 할 때만 : JSON.stringify({a:1,b:2}) !== JSON.stringify({b:2,a:1})
) 속성 수를 확인하고 각 속성도 비교해야합니다.
심층 비교가 필요한 경우 함수를 재귀 적으로 호출 할 수 있습니다.
그러면이 함수를 사용하여 배열의 개체를 쉽게 비교할 수 있습니다. 라코 디스
다음을 시도해보세요 : 라코 디스
다음은 노드의 assert 모듈 을 사용한 제 시도입니다. +npm 패키지 object-hash .
두 배열간에 순서가 다르더라도 두 배열에 동일한 개체가 포함되어 있는지 확인하고 싶다고 가정합니다. 라코 디스
@JasonBunting의 답변에 언급 된 objectsAreSame
함수는 저에게 잘 작동합니다.하지만 약간의 문제가 있습니다. x[propertyName]
와 y[propertyName]
가 객체 (typeof x[propertyName] == 'object'
) 인 경우이를 비교하려면 함수를 재귀 적으로 호출해야합니다.
lodash의 _.some
사용 : https://lodash.com/docs/4.17.11#일부
라코 디스