从数组中查找对象的值

时间:2013-01-26 10:56:58

标签: javascript

是否有更简单(或更有效)的方法来实现以下目标:

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数字不会按顺序运行。

提前致谢。

2 个答案:

答案 0 :(得分:1)

如果您的代码仅按顺序工作,那么您可以按sort或其他任何方式id项目,您的代码应该正常工作吗?试试这个:

_dataObjects = _dataObjects.sort(function(a, b) {
  return a.id > b.id;
});

答案 1 :(得分: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;
}