如何使这个for循环更高效

时间:2013-07-19 09:00:00

标签: javascript

我想改进这个循环。理想情况下,我不希望变量'nodeFound'在函数范围之外,我想在循环完成后找不到'nodeFound'。

var nodeFound;
proto._getNodeById = function(id, node) {
    var data = node || this._data;
    var l = data.length;
    var i;

    for ( i = 0; i < l; i++) {
        if (Number(id) === data[i].id) {
            nodeFound = data[i];
        } else {
            if (data[i].children.length) {
                this._getNodeById(id, data[i].children);
            }
        }
    }
    return nodeFound;
};

3 个答案:

答案 0 :(得分:0)

使用while

proto._getNodeById = function(id, node) {
    var data = node || this._data;
    var l = data.length;
    var i=0;
    var found = false;
    var nodeFound = undefined;

    while ( i < l && !found ) {
        if (Number(id) === data[i].id) {
            nodeFound = data[i];
            found = true
        } else {
            if (data[i].children.length) {
                var node = this._getNodeById(id, data[i].children);
                if (node != undefined) {
                    nodeFound = node; 
                    found = true;
                }
            }
        }
        i++;
    }
    return nodeFound;
};

答案 1 :(得分:0)

proto._getNodeById = function(id, node) {

  var data = node || this._data;
  var thisNode = null;
  var l = data.length;
  var i;

  id=+id; // convert to number

  for ( i = 0; i < l; i++) {
      thisNode = data[i] ;
      if (id === thisNode.id) {
          return thisNode;
      } else if (thisNode.children.length) {
          thisNode = this._getNodeById(id, thisNode.children);
          if (thisNode) return thisNode; 
      }        
  }
  return null;
};

答案 2 :(得分:0)

如果将数据存储在JSON对象中,则不需要循环。 所以你的表现会增加很多。

但您需要更改数据格式......

data = {
  'id1':    {
    'property1':  'value',
    'property2':  'value',
    'property3':  'value',
    'children': {
      'property1':  'value',
      'property2':  'value',
      'property3':  'value',
      'id2':    {
        'children': {
          ...
        }
      },
      'id3':    {
        'property1':  'value',
        'property2':  'value',
        'property3':  'value',
        'children': {
          ...
        }
      }
    }
}

之后,代码看起来像这样

proto._getNodeById = function(id, node) {
  var data = node || this._data;

  if( data[id] !== undefined ) {
    nodeFound = data[id];
  }
  else if ( data[id] && data[id].children ) {
    this._getNodeById( id, data[id].children );
  }

  return nodeFound;
};

有帮助吗?