Javascript 递归JS函数每秒错过一次循环

Javascript 递归JS函数每秒错过一次循环,javascript,Javascript,我有一个函数,它的格式是 u1fsQExd1aZmnpL : { 2FNdVdkaefaD6xQ : { fZ0zn6d51TgVqID : { 05E1JSFYVHJlGVP : {} } } } 并将其更改为 u1fsQExd1aZmnpL : { subfields : { 2FNdVdkaefaD6xQ : { subfields : {

我有一个函数,它的格式是

u1fsQExd1aZmnpL : {
    2FNdVdkaefaD6xQ : {
        fZ0zn6d51TgVqID : {
            05E1JSFYVHJlGVP : {}
        }
    }
}
并将其更改为

u1fsQExd1aZmnpL : {
    subfields : {
        2FNdVdkaefaD6xQ : {
            subfields : {
                fZ0zn6d51TgVqID : {
                    subfields : {
                        05E1JSFYVHJlGVP : {
                            subfields : {}
                        }
                    }
                }
            }
        }
    }
}
然而,结果是:

u1fsQExd1aZmnpL : {
    subfields : {
        2FNdVdkaefaD6xQ : {
            fZ0zn6d51TgVqID : {
                subfields : {
                    05E1JSFYVHJlGVP : {}
                }
            }   
        }
    }
}
注意:它错过了第二个
“子字段”
步骤

它每秒钟循环一次。ie:添加到
05E1JSFYVHJlGVP
的下一个ID将在其内部,没有
子字段
父字段,但它将在其内部有
子字段
子字段

我的方法是:

        function get_into_subfields(form_structure) {
            for(var mainid in form_structure) {
                if(!form_structure[mainid].hasOwnProperty('subfields')) {
                    form_structure[mainid]['subfields'] = {};
                }
                for(var key in form_structure[mainid]) {
                    if(key != 'subfields') {
                        form_structure[mainid]['subfields'][key] = get_into_subfields(form_structure[mainid][key]);
                        delete(form_structure[mainid][key]);
                    }
                }
            }
            return form_structure;
        }
你知道我做错了什么吗

编辑:


这非常简单,但我认为您的函数有点复杂。问题是您不希望第一个是
子字段
对象,但为什么不呢?这将使它变得更简单,只需将
.subview
添加到结果中,即可获得相同的结果

var obj={'u1fsQExd1aZmnpL':{'2FNdVdkaefaD6xQ':{'fZ0zn6d51TgVqID':{'05E1JSFYVHJlGVP':{}
功能子字段(数据){
//只需创建一个可以返回的标准对象
var result={子字段:{};
for(var输入数据){
//现在递归地添加它
结果.子字段[键]=子字段(数据[键])
}
返回结果;
}
log(“完整结果”,子字段(obj));
console.log('忽略返回的初始子字段',子字段(obj).subfields);

document.write(“”+JSON.stringify(subfields(obj).subfields)+“”)
只需获取所有键并迭代属性即可。如果项目是对象,则迭代该项目

功能go(r,o){
Object.keys(o).forEach(函数(k){
r[k]={子字段:{};
o[k]=='object'和&go(r[k]。子字段,o[k]);
});
}
var source={'u1fsQExd1aZmnpL':{'2FNdVdkaefaD6xQ':{'fZ0zn6d51TgVqID':{'05E1JSFYVHJlGVP':{},
目标={};
go(目标、来源);

document.write(“”+JSON.stringify(target,0,4)+“”)子字段
?@JonSurrell是的,我想采取每一步并在它们之间插入一个
子字段
键。您是否可以尝试编辑您的问题以使其清晰?这很有效,但是第一个不应该是
子字段
值,因为我正在构建一个问题/表单生成器,树的开头(
u1fsQExd1aZmnpL
)是主要问题,下面是子问题that@Haring10我知道,但你似乎不知道你能多么容易地把它弄出来。由于您的函数是一致的,您可以通过执行subfields(obj)来轻松获得初始子字段结果。subfields
将初始字段作为第一个对象。我提供了一个对我的代码片段的更新,以准确地显示这一点。我不知道
文档。write
可以用于SO代码片段。它过去常常出错。。。酷!