Рекурсивная итерация по объекту в шаблоне Jade?

У меня есть объект свойств смешанного типа - некоторые строки, некоторые массивы строк, некоторые объекты, содержащие массивы строк, - которые потенциально могут идти на много уровней глубже.

Я хотел бы перебрать все свойства, чтобы объект создавал div, массив создавал div, а строковое свойство создавало диапазон для содержания текста.

{ "string" : "some text", "object" : { "array" : [ "text" ] } }

Вышеупомянутый объект будет отображаться как:

<span>some text</span>
<div>
  <div>
    <span>text</span>
  </div>
</div>

Но обычно гораздо более сложные конструкции. Как мне это сделать, Джейд?


person Tom    schedule 13.11.2011    source источник


Ответы (3)


Ты давно не спрашивал, но mixin, кажется, твой друг. Я не пробовал, но если миксины поддерживают рекурсию, это должно работать:

mixin parseObject(obj)
  div
    - each val, key in obj
      - if (typeof val === 'string')
        span #{val}
      - else if (typeof val === 'object')
        mixin parseObject(val)

Затем в теле файла .jade вызовите mixin parseObject(rootObject).

person mna    schedule 10.02.2012
comment
третья сторона здесь. Я пробовал это, но миксин, похоже, не любит рекурсию :( - person Robert Martin; 29.04.2012
comment
Как автор оригинального постера, я обновил ваш код, включив в него mixin (спасибо 0x80) и правильные префиксы -. - person Jason McCreary; 08.10.2012

Рекурсия, похоже, теперь поддерживается. Я успешно использовал эту функцию с небольшой поправкой; вам нужно использовать ключевое слово mixin при вызове функции.

mixin parseObject(obj)
  div
    each val, key in obj
      if typeof val === 'string'
        span #{val}
      else if typeof val === 'object'
        mixin parseObject(val)
person Thijs Koerselman    schedule 27.08.2012

В современной версии Jade это выглядит так

mixin parseObject( obj )
  div
    each val in obj
      if typeof val === 'string'
        span= val
      else if typeof val === 'object'
        +parseObject( val )

Затем в теле файла .jade вызовите

+parseObject( rootObject )

person Sunrise    schedule 15.03.2015