2012-05-01 4 views
0

SelectedItems이라는 int 배열이 있습니다. 나는 AvailableItems이라는 객체가 들어있는 다른 배열을 가지고 있으며 json에서 파싱되었습니다. 이 Item 개체의 속성은 {ContainerID, ContainerName, ItemID, ItemName}입니다.자바 배열 int 배열을 객체 배열로 변환

제가 ItemID 각각은 AvailableItems에서 ItemID에 대응 Item 객체로 대체 Items의 배열 int 배열로부터 SelectedItems 변환 할. SelectedItems의 각 ItemID은 고유합니다.

나는이 개 루프 시작 : SelectedItems의 각 요소를 순환 한하지만 내가 SelectedItems에 복사하는 데 필요한 객체 키가 해당 ItemID을 찾기 위해 AvailableItems 매번 반복 자신을 찾을 수 있습니다.

그래서 기본적으로 매우 비효율적 인 루프를 만들었습니다. 루프 내부에서 반복되는 루프를 피함으로써 더 좋은 방법이 있는지 궁금합니다.

샘플 데이터 : AvailableItems를 들어

, 당신은 1,000 개체 수 있습니다와

{ 
    ContainerID: i, 
    ContainerName: 'SomeName', 
    ItemID: j, 
    ItemName: 'SomeOtherName' 
} 

이 다음 SelectedItems는 int 치의

[23,43,64,34...] 

감사의 배열입니다.

+0

두 번째 배열을 첫 번째 배열에 따라 필터링 한 다음 Array와 같은 함수를 사용하여 결과를 반환 할 수 있습니다.필터를 사용하면 조건이 true가 될 때마다 Array.indexOf가있는 첫 번째 요소에 요소가 포함되어 있는지 확인할 수 있습니다. – mpm

+0

@camus : 좋아요, 당신의 의견은 그것을 다시하는 법에 대한 아이디어를주었습니다. jQuery.extend를 사용하여 AvailableItems 배열을 CandidateItems라는 새 배열에 복사 한 다음 해당 배열을 반복합니다. 각 요소의 ItemID가 $ .InArray가있는 SelectedItems에 있는지 확인하고 삭제하지 않으면 해당 요소를 삭제합니다. 루프가 끝나면 SelectedItems에 CandidateArray를 할당하고 – frenchie

답변

1

AvailableItem을 ID별로 주소 지정하여 전체 배열을 반복하지 않고 임의로 가져올 수있는 경우 (ID가 인덱스 기반 배열 인 경우) SelectedItems으로 이동하여 if 그것은 AvailableItems에 존재하며, 그렇다면 SelecteItem을 오브젝트로 변환하고 나중에 사용할 수 있도록 임시 배열에 추가하십시오.

+0

을 확인합니다. 답을 다시 실행하는 방법에 대한 아이디어가 있습니다. jQuery.extend를 사용하여 AvailableItems 배열을 CandidateItems라는 새 배열에 복사 한 다음 해당 배열을 반복합니다. 각 요소의 ItemID가 InArray가있는 SelectedItems에 있는지 확인하고 삭제되지 않은 경우 해당 요소를 삭제합니다. 루프의 끝에서 CandidateArray를 SelectedItems와 voila에 할당합니다. – frenchie

2

숫자 배열 AvailableItems에 각 개체를 ItemID과 일치하는 인덱스로 넣을 수 있습니다.

따라서 ItemID이 5 인 항목은 반복하여 찾아야하는 대신 AvailableItems[5]에 있습니다.

다른 ItemID 값 사이에 큰 차이가있을 때 어떤 효과가 있을지 확실하지 않지만 시도해보고 효과가 있는지 확인할 수 있습니다.


UPDATE :

빠른 검색 후

this answer를 읽고, 그것은 메모리의 무리를 낭비하지 것이다 인덱스 사이의 간격을 가진 것 같습니다. 그러나 이는 AvailableItems.length을 검사 한 결과에 영향을 미칩니다. 항목이 하나 있지만 배열의 색인이 500 인 배열이있는 경우 AvailableItems.length은 배열에 단 하나의 항목 만 있더라도 501을 반환합니다.

length 함수를 사용할 필요가없는 한이 솔루션이 도움이 될 것입니다.

+0

오케이, 나는 그것을 다시하는 방법에 대한 아이디어를 얻었다. jQuery.extend를 사용하여 AvailableItems 배열을 CandidateItems라는 새 배열에 복사 한 다음 해당 배열을 반복합니다. 각 요소의 ItemID가 InArray가있는 SelectedItems에 있는지 확인하고 삭제되지 않은 경우 해당 요소를 삭제합니다. 루프가 끝나면 CandidateArray를 SelectedItems에 할당하고 – frenchie

관련 문제