2013-02-24 2 views
2

두 개의 배열 oldArraynewArray이 있습니다. 새로운 가치가 newArray에 입력되면 나는 oldArray과 비교하고 새로운 가치를 끌어 내고 싶습니다.두 배열의 해시에서 차이점을 찾을 수

이러한 배열에서 나는 해시를 저장하고 있습니다.

예를 들면.

미세 처음 작동
newElement = _.difference(newValue, oldValue) 

하지만 때 내가 :

oldArray = [] 
newArray = [{"one": 1}] 

은 내가 이런 식으로 뭔가를 할 수 underscore.js를 사용 {"one": 1}

있는 새로운 요소를 찾을 필요 돌아가서 배열에 더 추가 :

oldArray = [{"one": 1}] 
newArray = [{"one": 1},{"two": 2}] 

을 그리고 같은 일을 할

나는 새로운 객체로 돌아 오는 [{"one": 1},{"two": 2}]을 얻습니다. 객체와 값을 비교하지 않기 때문입니까? 이 작업을 수행하는 더 좋은 방법이 있습니까?

은 예입니다하지만이 두 내가 얻을 비교할 때 내 응용 프로그램에서 나는 콘솔

oldValue map.js:85 
[Object] 
0: Object 
$$hashKey: "007" 
address: "england" 
latLng: GeoCode 
__proto__: Object 
length: 1 
__proto__: Array[0] 

newValue map.js:83 
[Object, Object] 

0: Object 
$$hashKey: "007" 
address: "england" 
latLng: GeoCode 
__proto__: Object 

1: Object 
$$hashKey: "009" 
address: "france" 
latLng: GeoCode 
__proto__: Object 
length: 2 
__proto__: Array[0] 

에서이 뽑아 한 : 나는이 프로젝트에 AngularJS와 밑줄을 사용하고

[Object, Object] 
0: Object 
$$hashKey: "007" 
address: "england" 
latLng: GeoCode 
__proto__: Object 

1: Object 
$$hashKey: "009" 
address: "france" 
latLng: GeoCode 
__proto__: Object 
length: 2 
__proto__: Array[0] 

을 현재.

아마도이 작업을 수행하는 것이 훨씬 더 좋습니다. 그 배열에서 "다른"객체를 꺼내기 만하면됩니다. 그래서 나는 그것을 다른 것을하기 위해 사용할 수 있습니다. 항상 마지막 요소가되는 것은 아닙니다.

UPDATE 나는 또한하지만 같은 결과를 자바 스크립트 배열 설정 수학 라이브러리를 시도하고 .substract을 사용했다

. 이것은 해시가 바뀌고 있음을 의미해야합니다. 그러나 그들은 내게 보이지 않습니다.

이 내용을 얻으려면 oldArraynewArray 저는 각도 $ 시계를 사용하고 있습니다.

+0

jsfiddle.net과 같이 축소 된 테스트 케이스를 제공 할 수 있습니까? – Dogbert

답변

1

$$hashKey이 항상 고유하면 두 개의 개체를 만들어 해시 키를 $$hashKey으로 만들 수 있습니다.

newObject[myObject["$$hashKey"]] = myObject; 

그런 다음

var difference = _.omit(newObject, _.keys(oldObject)); 

당신 만이 NewObject에 있었다하지만 이전하지 키/값 쌍을 포함 포함하는 객체를 제공 할 것입니다.

고유 키가 없으면 개체를 문자열로 serialize하고 deserialize 한 다음 _.difference을 사용하는 것이 덜 편리합니다.

+0

$$ hashKey는 항상 unqiue입니다. –

+0

이 작업은 매우 흥미 롭습니다. 왜 다른 함수가 작동하지 않는지 궁금합니다. –

+0

JavaScript에서 객체 간의 비교는 키/값 쌍이 아닌 엄격한 ID로 수행됩니다. 그래서'foo = {5 : 6}; 바 = {5 : 6}; foo == bar; // false' –

0

오래 전에 simular AngularJS 챌린지에 출연했습니다.이 문제를 어떻게 관리해야하는지에 대한 절대적인 답을 드릴 수는 없지만, 나를 위해 일한다고 말할 수있는 것은 다음과 같습니다.

먼저 $ watch를 올바르게 사용하고 있는지 확인하십시오. | 식 각 $ 소화주기 평가 - - {(문자열 기능())}

  • watchExpression : 그것은 3 PARAMS 걸립니다. 리턴 값의 변경은 리스너에 대한 호출을 트리거합니다. 문자열 : 표현식으로 계산 됨 function (범위) : 현재 범위를 매개 변수로 호출되었습니다.
  • listener (선택 사항) - {(function() | string) =} - watchExpression의 반환 값이 변경 될 때마다 콜백이 호출됩니다. 문자열 : 표현식으로 평가 됨 function (newValue, oldValue, scope) : 현재 값과 이전 값을 매개 변수로 호출합니다.
  • objectEquality (선택 사항) - {부울 값} - 객체를 참조가 아닌 같음과 비교합니다.

마지막 부분은 특히 중요합니다. 당신은 당신의 경우 objectEquality에 대한보고 싶은, 그래서과 같이 $ 사용보고해야합니다 :

$scope.$watch('watchObject', fn({}), true);

참고 위의 세 번째 PARAM로 true의 사용. Angular Scope Docs에서 더 많은 것을보십시오.

두 번째 : 각도 오브젝트를 diffing 할 때 $$ hashKeys를 비교할 때의 답은 많은 의미를 가질 수 있다고 생각합니다. 당신은 또한 당신이 반환하고 싶은 것에 따라 자신의 diff 함수를 작성하는 것을 고려할 수도 있습니다. 차이를 반환하고 기본 객체를 비교하는 경우에만 다음을 시도하십시오. jQuery objectDiff

세 번째 : 객체를 중첩 된 객체 및/또는 그 내부의 배열과 비교하려면 다음을 수행하십시오. 어려운. 나는 이렇게하는 최적화되지 않은 방법을 썼다. 그리고 내가 필요하다면 나는 더 많은 빛을 행복하게 흘릴 것이다.

행운을 빈다.

+0

이 부분에 너무 많은 빛을 보내 주셔서 감사합니다! –

+0

땀 냄새가 없습니다! Angular bliss에 대한 경로 즐기기 :) – nauce

관련 문제