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 回答