0

と呼ばれるintの配列がありますSelectedItemsAvailableItems呼び出され、json から解析されたオブジェクトを含む別の配列があります。これらのItemオブジェクトにはプロパティがあります{ContainerID, ContainerName, ItemID, ItemName}

SelectedItemsint の配列からItems、それぞれがin に対応するオブジェクトにItemID置き換えられる配列に変換したいと考えています。それぞれがユニークです。ItemItemIDAvailableItemsItemIDSelectedItems

私は 2 つのループから始めました。1 つは の各要素をループしますが、コピーする必要があるオブジェクト キーに対応する を毎回ループして見つけSelectedItemsます。AvailableItemsItemIDSelectedItems

したがって、基本的に、一見非常に非効率的なループを構築しました。ループ内で繰り返されるループを回避することで、より良い方法があるかどうか疑問に思っていましたか?

サンプルデータ:

についてAvailableItemsは、

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

with は 1,000 個のオブジェクトでSelectedItems、int の配列です

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

ありがとう。

4

2 に答える 2

2

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

したがって、ループして検索する必要はなく、ItemIDが 5のアイテムが at にあることがわかります。AvailableItems[5]

異なる値の間に大きなギャップがある場合、これがどのような影響を与えるかはItemIDわかりませんが、試してみて、うまく機能するかどうかを確認してください。


アップデート:

簡単に検索してこの回答を読んだ後、インデックス間にギャップがあっても大量のメモリが無駄になることはないようです。ただし、チェック結果に影響しAvailableItems.lengthます。1 つのエントリを持つ配列があり、そのエントリのインデックスが 500 の場合AvailableItems.length、配列にエントリが 1 つしかない場合でも、501 が返されます。

関数を使用する必要がない限りlength、このソリューションはうまくいくはずです。

于 2012-05-01T15:15:42.890 に答える
1

ID でアドレス指定するだけで配列全体をループせずに任意のものを取得できる場合AvailableItem(ID がインデックスであるインデックスベースの配列がある場合)、 を通過して、にSelectedItems存在するかどうかを確認できます。次に、をオブジェクトにAvailableItems変換し、後で使用するために一時配列に追加します。SelecteItem

于 2012-05-01T15:15:28.857 に答える