我想改进这个循环。理想情况下,我不希望变量'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;
};
答案 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;
};
有帮助吗?