2011-09-09 2 views
2

두 개의 목록이있는 웹 페이지가 있습니다. 검색으로 채워지는 소스 목록 (availableThings로 표시) 및 사용자가 선택한 항목 (selectedThings). selectedThings의 고유 목록을 유지하려고하므로 이미 선택한 항목을 사용 가능한 목록에서 제거하려고합니다. 아래의 코드 조각에서 data.AvailableThings은 서버에서 채워지며 사용자가 선택한 사항을 알지 못합니다. 사용자는 최대 3 개의 항목을 선택할 수 있으며, selectedThings.items에는 3 개를 초과 할 수 없습니다. availableThings.items은 잠재적으로 수천 개가 될 수 있습니다.느낌이 비효율적입니까?

availableThings.items이 채워지면 HTML 생성을 위해 ICanHaz에 입력합니다. FWIW, 나는 목록 간의 드래그 동작에 jQuery를 사용하고 있지만 질문은 jQuery에 무관심합니다. N은 사용 가능한 것들의 수이고, m이 선택된 것들의 카운트 경우

[... jQuery AJAX call snipped ...] 
success: function (data) { 

    availableThings.items = []; 

    for (var thing in data.AvailableThings) { 
     var addToList = true; 

     for (var existing in selectedThings.items) { 
      if (existing.Id === thing.Id) { 
       addToList = false; 
       break; 
      } 
     } 

     if (addToList) { 
      availableThings.items.push(thing); 
     } 
    } 
} 
+0

'ICanHaz'? ... 우연히 LOLCODE의 어떤 형태와 통합되어 있습니까? –

+0

ICanHaz는 Mustache 및 jQuery 템플릿을 결합한 템플릿 라이브러리입니다. http://icanhazjs.com –

+0

서버에서 오는 AvailableThings 목록에 어떤 종류의 순서가 있습니까? – yoozer8

답변

2

후이를 ID로 해싱 경우, (N + m O 이것을 회전 할 수있는 반면 O (n 개 *의 m)이고).

var existingIds = {}; 

for (var existing in selectedThings.items) { 
    existingIds[existing.Id] = existingIds; 
} 

availableThings.items = []; 
for (var thing in data.AvailableThings) { 
    if (existingIds[thing.Id] !== existingIds) { 
     availableThings.items.push(thing); 
    } 
} 
+0

어떻게 생겼습니까? 내 템플릿 라이브러리에 적어도'availableThings.items' 배열 (해시 허용)을 유지해야합니다. –

+0

답변으로 편집 중입니다. –

1

서버에서 오는 데이터 (ID, 이름 순서, 또는 필드) 순서의 어떤 종류가있는 경우, 선택한 세트의 각 항목에 대한 이진 검색을 할 단지 수 발견되면 제거하십시오. 이것은 m 개의 아이템의 선택이 허용되는 n 개의 아이템의 데이터 세트에 대해 O (m log n)로 그것을 감소시킬 것이다. 3로 고정되었으므로 본질적으로 O (log n)가됩니다.

관련 문제