0

以下を達成するためのより簡単な(またはより効率的な)方法はありますか:

var _dataObjects = [{id:0, data:"data0", nextID:1}, 
                    {id:1, data:"data1", nextID:2}, 
                    {id:2, data:"data2", nextID:3} .. etc.];
generateNextPieceOfData();

function generateNextPieceOfData(){
    var len = _dataObjects.length;
    for ( var i = 0; i < len; i ++ ) {
        var nextDataID = _dataObjects[i].nextID;
        var nextData;
        for ( var j = 0; j < len; j ++ ) {
            if( _dataObjects[j].id == nextDataID ){
                nextData = _dataObjects[j].data;
                break;
            }
        }
    }
}

上記の例は、私が抱えている問題から抽象化されたものであり、この例では ID 番号が連続していることに気付きましたが、実際の問題nextID番号は連続していません。

前もって感謝します。

4

2 に答える 2

1

あなたのコードがシーケンシャルにしか機能しない場合sort、アイテムをid何によってでも、コードが正しく機能するはずですか? これを試して:

_dataObjects = _dataObjects.sort(function(a, b) {
  return a.id > b.id;
});
于 2013-01-26T11:01:46.243 に答える
1

問題に適したデータ構造を使用してください。ID でオブジェクトを見つけたいので、ID をキー、オブジェクトを値としてハッシュ マップを作成します。

var object_map = {};

for(var i = 0, l = _dataObjects.length; i < l; i++) {
    objects[_dataObjects[i].id] = _dataObjects[i];
}

次に、次のオブジェクトを取得するのは簡単です:

var next_object = object_map[someObject.nextID];

ただし、何らかの終了条件が満たされるまで、まだ反復があります。例えば:

function generatePath(id_a, id_b) {
    var obj = object_map[id_a];
    var path = [obj];

    while (obj && obj.id !== id_b) {
        obj = object_map[obj.nextID];
        path.push(obj);
    }
    return path;
}
于 2013-01-26T11:08:57.293 に答える