Javascript 将每个树节点IE8中对父节点的引用设置回堆栈空间之外
从…继续 我只想转换一个层次结构,并将一个属性Javascript 将每个树节点IE8中对父节点的引用设置回堆栈空间之外,javascript,internet-explorer-8,tree,traversal,Javascript,Internet Explorer 8,Tree,Traversal,从…继续 我只想转换一个层次结构,并将一个属性parent设置为其父节点。所以它是双向的 function attach_back_reference(hierarchy, parent){ for(var i in hierarchy){ if(jQuery.isPlainObject(hierarchy[i])) attach_back_reference(hierarchy[i], hierarchy);
parent
设置为其父节点。所以它是双向的
function attach_back_reference(hierarchy, parent){
for(var i in hierarchy){
if(jQuery.isPlainObject(hierarchy[i]))
attach_back_reference(hierarchy[i], hierarchy);
else if(jQuery.isArray(hierarchy[i]))
for(var it in hierarchy[i])
attach_back_reference(hierarchy[i][it], hierarchy);
}
hierarchy.parent = parent;
}
上述功能在chrome、opera、firefox和IE9中运行良好。除了IE 8中的堆栈空间外。但我看不到它会走向无限递归,因为IE8的堆栈限制比其他浏览器小得多,所以我猜你的javascript可能已经达到了IE8的限制 这是一个不使用递归的代码版本,因此不会出现这种情况:
function attach_back_reference( hierarchy, parent ) {
var q = [{obj:hierarchy, p:parent}];
while( q.length ) {
var o = q.pop( ), x = o.obj;
if( x.parent ) {
continue;
}
for( var i in x ) {
if( jQuery.isPlainObject( x[i] ) ) {
q.push( {obj:x[i], p: x} );
} else if( jQuery.isArray( x[i] ) ) {
for( var j in x[i] ) {
q.push( {obj:x[i][j], p: x} );
}
}
}
o.p && (x.parent = o.p);
}
}
(如果给定一个带有循环的图,它也不会挂起,但这仍然不是一个好主意)如果树中有某种循环,我建议添加if(hierarchy.parent)return;在函数的顶部。