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

Recursive JS function misses every second loop

本文关键字:一次 循环 错过 JS 函数 递归      更新时间:2023-09-26

>我有一个函数来采用

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;
        }

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

编辑:

这是 JSFiddle

只需获取所有键并迭代属性即可。如果该项是对象,则循环访问该项。

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>');

这是非常简单的,但我认为你的函数有点复杂。问题是你不希望第一个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>')

这将在链的末端留下一个空对象,假设这不是问题,尽管您仍然可以做很多事情来确保这不会出错,但基本工作。