2011-09-09 85 views
2

我有一個包含兩個列表的網頁。由搜索填充的源列表(由availableThings表示)以及用戶選擇的項目(selectedThings)。我想保持selectedThings的唯一列表,所以我想從可用事物列表中刪除已選擇的事物。在我的代碼片段中,data.AvailableThings從服務器填充並且不知道用戶選擇的東西。用戶最多可以選擇3項,ergo selectedThings.items將包含不超過3項。 availableThings.items可能有幾千個。這是否像效率低下?

availableThings.items得到填充後,我將它送入ICanHaz進行HTML生成。 FWIW,我使用jQuery在列表之間拖動行爲,但問題是與jQuery無關。

[... 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 templ:http://icanhazjs.com –

+0

有沒有對來自服務器的AvailableThings列表有任何順序? – yoozer8

回答

2

如果n是可用的事物的計數和m是選擇的事物的計數,那麼這是O(n * m個),而如果通過ID散列,你可能變成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,名稱排序,或任何字段)從服務器的數據,你可能只是做了每個所選的一組項目的二進制搜索,如果發現它們,將它們移除。這可以將其減少到O(m log n),其中n個項目的數據集允許選擇m個項目。既然你已經把它固定爲3,那它本質上就是O(log n)。