2012-05-01 20 views
0

私はSelectedItemsというintの配列を持っています。私はAvailableItemsと呼ばれるオブジェクトを含む別の配列を持っており、それはjsonから解析されました。これらのItemオブジェクトのプロパティは{ContainerID, ContainerName, ItemID, ItemName}です。javascript intの配列をオブジェクトの配列に変換する

Iは各ItemIDAvailableItemsItemIDに対応Itemオブジェクトに置き換えられItemsの配列にintの配列からSelectedItemsを変換します。 SelectedItemsの各ItemIDは一意です。

は、私は2つのループで開始: SelectedItemsの各要素をループ1が、その後、私は SelectedItemsにコピーする必要があるオブジェクトキーとの対応 ItemIDを見つけること AvailableItems経由するたびにルーピング自分自身を見つけます。

私は基本的に非常に非効率的なループを構築しました。私はループの中で繰り返されるループを避けることによってそれを行うより良い方法があるのだろうかと思っていましたか?

サンプルデータ:AvailableItemsについては

、あなたは千個のオブジェクトで、その後SelectedItemsことで

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

を持つint型

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

の配列は感謝です。

+0

最初の配列に従って2番目の配列をフィルタリングし、結果をArrayのような関数で返すことができます。フィルタを使用すると、最初の要素にArray.indexOfが含まれているかどうかを確認できます.Array.indexOfは、条件がtrueになるたびに> -1にする必要があります。 – mpm

+0

@camus:あなたのコメントは、それをよりうまくやり直す方法のアイデアを与えました。 jQuery.extendを持つAvailableItems配列をCandidateItemsという名前の新しい配列にコピーし、次にその配列をループします。各要素のItemIDが$ .InArrayのSelectedItemsにあるかどうかを確認し、そうでない場合はその要素を削除します。ループの最後に、CandidateArrayをSelectedItemsに割り当てて、 – frenchie

答えて

1

AvailableItemをIDでアドレス指定するだけで配列全体をループせずに取得できる場合は(IDがインデックスであるインデックスベースの配列がある場合)SelectedItemsに行き、ifそれはAvailableItemsに存在し、それではSelecteItemをオブジェクトに変換し、後で使用するために一時的な配列に追加します。

+0

okと答えました。あなたの答えは、それをやり直す方法のアイデアでした。私はjQuery.extendを持つAvailableItems配列をCandidateItemsという新しい配列にコピーし、次にその配列をループします。各要素のItemIDがInArrayでSelectedItemsにあるかどうかを確認し、そうでない場合はその要素を削除します。ループの最後に、私はSelectedItemsとvoilaにCandidateArrayを割り当てます。 – frenchie

2

数値配列AvailableItemsの各オブジェクトを、ItemIDと一致するインデックスに配置できます。

ItemIDが5のアイテムは、ループスルーして見つけるのではなく、AvailableItems[5]にあることがわかります。

異なるItemID値の間に大きなギャップがある場合、これがどのような影響を及ぼすのかはっきりしませんが、試してみるとうまくいくかどうか確認できます。


UPDATE:クイック検索後

、およびthis answerを読んで、それはあなたのインデックスの間のギャップは、メモリの束を無駄にしません持つように見えます。ただし、AvailableItems.lengthのチェック結果に影響します。 1つのエントリを持つ配列があり、そのエントリのインデックスが500の場合、AvailableItems.lengthは配列に1つのエントリしかないのに501を返します。

length関数を使用する必要がない限り、この解決策が有効です。

+0

私はそれをやり直す方法についてのアイディアを得ました。 jQuery.extendを持つAvailableItems配列をCandidateItemsという新しい配列にコピーし、その配列をループします。各要素のItemIDがInArrayのSelectedItemsにあるかどうかを確認し、そうでない場合はその要素を削除します。ループの終わりに、私はSelectedItemsとvoilaにCandidateArrayを割り当てます – frenchie

関連する問題