javascript - 从 json 菜单对象构建面包屑的递归函数

标签 javascript recursion lodash

所以我一直在努力理解这个递归函数并获得正确的结果。

const _ = require('lodash');

let config = {
    "Main": {
        children: {
            "Dashboard": "main.dashboard",
            "Account": {
                children: {
                    "Settings": "main.account.settings"
                }
            }
        }
    },
    "Statistics": {
        children: {
            "Test One": "main.statistics.test.one",
            "Test Two": "main.statistics.test.two"
        }
    }
}

let processNav = (config, parent) => {
    let children;
    let results = {};

    _.forOwn(config, (value, title) => {
        var breadcrumb = parent || title;

        if (value.children) {
            children = processNav(value.children, breadcrumb);
            _.assign(results, children);
        } else {
            results[value] = [breadcrumb, title];
        }
    });

    return results;
};

let breadcrumbs = processNav(config);

console.log(breadcrumbs);

// output
{ 'main.dashboard': [ 'Main', 'Dashboard' ],
  'main.account.settings': [ 'Main', 'Settings' ],
  'main.statistics.test.two': [ 'Statistics', 'Test Two' ] }

我正在寻找的输出更像是这样......

// expected output
{ 'main.dashboard': [ 'Main', 'Dashboard' ],
  'main.account.settings': [ 'Main', 'Account', 'Settings' ],
  'main.statistics.test.one': [ 'Statistics', 'Test One' ],
  'main.statistics.test.two': [ 'Statistics', 'Test Two' ] }

在我发疯之前,有人能帮我解决这个问题吗?

最佳答案

这种方法不使用 .lodash,只是简单的 JS。

let config = {    "Main": {        children: {            "Dashboard": "main.dashboard",            "Account": {                children: {                    "Settings": "main.account.settings"                }            }        }    },    "Statistics": {        children: {            "Test One": "main.statistics.test.one",            "Test Two": "main.statistics.test.two"        }    }};

function loop(obj, path, breadcrumbs) {
  Object.keys(obj).forEach(k => {        
    if (obj[k].children) loop(obj[k].children, [...path, k], breadcrumbs);
    else breadcrumbs[obj[k]] = [...path, k];    
  });
}

let breadcrumbs  = {};
loop(config, [], breadcrumbs);

console.log(JSON.stringify(breadcrumbs, null, 2));
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 从 json 菜单对象构建面包屑的递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49029805/

相关文章:

javascript - 如何在此 html 表中添加带有动态表值的行跨度?

java - 由于未事先设置先前的值,嵌套循环未计算正确的金额

javascript - 使用 Lodash 过滤具有数组字段的对象数组

javascript - lodash 不作为内部函数工作

javascript - 单击 div 时如何切换

javascript - 至少努力从 Ionic 迁移到 NativeScript

javascript - 通过 ssl 请求传递凭据是不安全的,更好的 (KISS) 解决方案是什么?

parsing - 递归地使用 Antlr4 解析器和监听器

c - 在c中传递一个二维子数组

javascript - 在 lodash 中使用 _.groupBy 将字符串聚合到数组中