我有一个格式为
的函数u1fsQExd1aZmnpL : {
2FNdVdkaefaD6xQ : {
fZ0zn6d51TgVqID : {
05E1JSFYVHJlGVP : {}
}
}
}
并将其更改为
u1fsQExd1aZmnpL : {
subfields : {
2FNdVdkaefaD6xQ : {
subfields : {
fZ0zn6d51TgVqID : {
subfields : {
05E1JSFYVHJlGVP : {
subfields : {}
}
}
}
}
}
}
}
然而,它出现了:
u1fsQExd1aZmnpL : {
subfields : {
2FNdVdkaefaD6xQ : {
fZ0zn6d51TgVqID : {
subfields : {
05E1JSFYVHJlGVP : {}
}
}
}
}
}
注意:它错过了第二个'subfields'
步骤。
每隔一个循环执行此操作。即:添加到05E1JSFYVHJlGVP
的下一个ID将位于其中,没有subfields
父级,但其中将包含subfields
子级。
我的方法是:
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;
}
关于我做错了什么的想法?
编辑:
答案 0 :(得分:1)
只需获取所有密钥并迭代属性即可。如果该项是对象,则迭代该项。
function go(r, o) {
Object.keys(o).forEach(function (k) {
r[k] = { subfields: {} };
typeof o[k] === 'object' && go(r[k].subfields, o[k]);
});
}
var source = { 'u1fsQExd1aZmnpL': { '2FNdVdkaefaD6xQ': { 'fZ0zn6d51TgVqID': { '05E1JSFYVHJlGVP': {} } } } },
target = {};
go(target, source);
document.write('<pre>' + JSON.stringify(target, 0, 4) + '</pre>');
答案 1 :(得分:0)
这很简单,但我觉得你的功能有点复杂。问题是你不希望第一个成为subfields
对象,但为什么不呢?这样可以更轻松,只需在结果中添加.subviews
即可获得相同的结果。
var obj = {'u1fsQExd1aZmnpL' : {'2FNdVdkaefaD6xQ' : {'fZ0zn6d51TgVqID' : { '05E1JSFYVHJlGVP' : {}}}}}
function subfields(data){
// Simply create a standard object that you can return
var result = {subfields:{}};
for(var key in data){
// now recursively add it
result.subfields[key] = subfields(data[key])
}
return result;
}
console.log('The full result', subfields(obj));
console.log('Ignore the initial subfield returned', subfields(obj).subfields);
document.write('<pre>' + JSON.stringify(subfields(obj).subfields) + '</pre>')
&#13;
这将在链的末尾留下一个空对象,这假设不是问题,尽管你仍然可以做很多工作来确保这不会出错,基础工作正常