2011-09-09 16 views
2

私は2つのリストを持つウェブページを持っています。検索によって作成されたソースリスト(availableThingsで表される)と、ユーザーが選択したアイテム(selectedThings)。 selectedThingsの一意のリストを維持したいので、すでに選択されているものを使用可能なリストから削除したいと思います。下記の私のコードスニペットでは、data.AvailableThingsはサーバーから取り込まれ、ユーザーが選択したものについては知識がありません。ユーザーは3つまでの項目を選択でき、ergo selectedThings.itemsは3つ以上の項目を含みません。 availableThings.itemsは潜在的に数千になる可能性があります。これは非効率的ですか?

availableThings.itemsが入力された後、HTML生成用にICanHazにフィードします。 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のテンプレートを組み合わせたテンプレートライブラリです。http://icanhazjs.com –

+0

AvailableThingsリストにはサーバーからの注文はありますか? – yoozer8

答えて

2

nが利用可能なものであり、mのカウントが選択されたものの数である場合は、IDによってハッシュ化された場合、あなたがOにこれを回すことができるのに対し、これはO(n個×m個)である(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)になります。

関連する問題