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

时间:2016-02-08 17:14:16

标签: javascript

我有一个格式为

的函数
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;
        }

关于我做错了什么的想法?

编辑:

Here is the JSFiddle

2 个答案:

答案 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即可获得相同的结果。

&#13;
&#13;
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;
&#13;
&#13;

这将在链的末尾留下一个空对象,这假设不是问题,尽管你仍然可以做很多工作来确保这不会出错,基础工作正常