読者です 読者をやめる 読者になる 読者になる

無駄なループを省くテクニック

非同期通信でサーバー側で生成したデータを取得する場合、JSONであってもXMLであってもリストとオブジェクト構造をもつ場合が多いと思います
例えば

[
	{ id:2000 , value:'hoge0' },
	{ id:1000 , value:'hoge1' },
	{ id:1200 , value:'hoge2' }
	......
]

というようなシンプルな物を考えるとします。
valueの中にさらにさまざまな情報をもつデータオブジェクトを持つような場合も多いでしょう。


このような場合初めに一度だけリストに対してループするのならいいですが何度も値にアクセスする可能性がある場合には無駄なループが大量に発生します
この場合idからvalueをとりたいというパターンが多いと思います。


無駄を省くために何をするかというとインデクシング的なことを初めに行っておきます。
具体的にはIDのリストを持つArrayとその中身をもつArrayに分割しておきます

//ID管理用の配列
//仮にidListという変数に格納されているものとする
[
	0:2000,
	1:1000,
	2:1200,
	......
]

//データアクセス用のObject(または配列)
//仮にaccessTableという変数に格納されているものとする
{
	2000:'hoge0',
	1000:'hoge1',
	1200:'hoge2',
	......
}

こうしておくことで、リストを取るときには

for( var i ; i < idList.length ; i++ ){
	var id    = idList[i];
}

値を取るときには

var value = accessTable[id];

という取り方ができるようになります。
IDから値をとるパターン(変更する場合も含め)が多い時にはこうしてあげることでかなりループ数を減らすことが可能になります


ここではidがユニークキーなので、例えばユニークキーがid0、id1と複数ある場合には上でのデータアクセス用のObjectをユニークキー分だけ多重化することで可能になります

var value = accessTable[id0][id1];

この場合の良い所はこれだけにとどまらず、そのIDでの値があるかを調べる場合に

if( accessTable[id0][id1] != undefined ){
	//値がある
}

だけで可能になります。
ループでまわして全ての値に対して調べるなどといった非効率性を排除できる上に非常に安定して高速なデータアクセスが可能になります。
一見めんどくさくなっているようですが、データアクセスが非常にシンプルになるのでバグの発生を抑えることも可能になります。


※ 補足
今は、説明のためにだらっと書いていますが、もちろんクラスでラッパーしておくべきです
凄いシンプルな例としては

HogeData.prototype = {
	getValue( id ){}
	setValue( id ){}
	hasValue( id ){}
	getIdList(){}
}

といったメンバーがあるようなかんじで。