在对象上递归迭代并将父项追加到每个孩子

时间:2015-07-20 12:00:20

标签: javascript templates object recursion multidimensional-array

我正在尝试为我的应用编写一个简单的模板管理器。我们的想法是所有模板都将列在一个多维对象/数组中,然后每个模板都会被某个函数解析。这是我的模板对象的样子:

var tpls = {
    home: 'home',
    about: 'about',
    shop: {
        basket: 'basket',
        checkout: {
            paypal: 'paypal',
            sagepay: 'sagepay',
        }
    },
    user: {
        profile: 'profile',
        settings: 'settings',
    }
};

这是我迄今为止所写的功能:

function listTemplates(o, parent, templates) {
    var templates = templates || [];

    _.each(o, function (v, k, l) {
        if (Object.keys(v).length > 0 && typeof v === 'object') {
            listTemplates(v, k, templates);
        } else if (typeof v === 'string') {
            var n = (typeof parent === 'string') ? parent + '/' + k : k;
            templates.push(n);
        }
    });

    return templates;
};

它做了我想要它做的事情,但是我正在努力弄清楚如何将嵌套的父名称附加到最终输出,以实现以下数组:

["home", "about", "shop/basket", "shop/checkout/paypal", "shop/checkout/sagepay", "user/profile", "user/settings"]

目前,该函数输出的嵌套模板没有顶级父项,如下所示:

["home", "about", "shop/basket", "checkout/paypal", "checkout/sagepay", "user/profile", "user/settings"]

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您忘记在第一个条件中传递父母:

if( Object.keys( v ).length > 0 && typeof v === 'object' ) {
    var n = ( typeof parent === 'string' ) ? parent + '/' + k : k;
    listTemplates( v, n, templates );
}

小提琴:http://jsfiddle.net/vt0oL8d5/输出:

["home", "about", "shop/basket", "shop/checkout/paypal", "shop/checkout/sagepay", "user/profile", "user/settings"]