0

Я пытаюсь написать простой менеджер шаблонов для своего приложения. Идея состоит в том, что все шаблоны будут перечислены в многомерном объекте/массиве, а затем каждая из них будет анализироваться некоторой функцией. Вот что мой объект шаблон выглядит следующим образом:Итерация рекурсивно на объект и добавление родителей к каждому ребенку

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

Вы забыли передать родитель в вашем первом случае условие:

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"] 
+0

святого гуакамол! это работает. вы не возражаете, объясняя немного больше ПОЧЕМУ я должен передать это в первом условии тоже? кажется, я всегда боролся с рекурсией ... – goodpixels

+0

«parent» имеет абсолютный путь к ребенку. В вашем коде вы отправляете только текущий родитель, который будет 'checkout' для' paypal' без отправки родительского элемента checkout, который будет 'shop'. Поэтому, когда вы перебираете детей в кассе, родитель должен быть 'shop/checkout', а не только' checkout'. –

+0

правый, я вижу. спасибо Seb! – goodpixels

Смежные вопросы