В случае, если @ mblase75 прав (читай: это невозможно), и никто больше не придумал ничего другого, вот обходной путь, который я придумала.
Пример jsFiddle
Поскольку tmpl
предварительно перепрыгивает уровень глубже в массивы, я только что придумал систему шаблонов, которые отскакивают друг от друга при появлении массива.Один шаблон обрабатывает только элементы массива, в то же время разрешая вложенные объекты / массивы в нем (кажется).Дублирование немного грубое, но, похоже, оно подходит для даже сумасшедших вложенных массивов.
HTML
<div class="results"></div>
<script id="arrayDisplayTemplate" type="text/x-jquery-tmpl">
<li>
{{if null !== $data && "object" === typeof ($data)}}
{{if $data instanceof Array}}
[
<ul>
{{tmpl($data, { formatDisplay: $item.formatDisplay }) "#arrayItemTemplate"}}
</ul>
]
{{else}}
{{tmpl($data, { formatDisplay: $item.formatDisplay }) "#reflectTemplate"}}
{{/if}}
{{else}}
${$item.formatDisplay($data)}
{{/if}}
</li>
</script>
<script id="reflectTemplate" type="text/x-jquery-tmpl">
<ul>
{{each(i, prop) $data}}
{{if $data.hasOwnProperty(i)}}
<li>
${i}:
{{if null !== prop && "object" === typeof (prop)}}
{{if prop instanceof Array}}
[
<ul>
{{tmpl(prop, { formatDisplay: $item.formatDisplay }) "#arrayDisplayTemplate"}}
</ul>
]
{{else}}
{{tmpl(prop, { formatDisplay: $item.formatDisplay }) "#reflectTemplate"}}
{{/if}}
{{else}}
${$item.formatDisplay(prop)}
{{/if}}
</li>
{{/if}}
{{/each}}
</ul>
</script>
JavaScript
var data = {
test1: 123,
test2: { w: [ "some", "string", "array" ], x: 1, y: 2, z: "abc" },
test3: [ "abc", "123", "def", "456" ],
test4: null
},
templateFunctions = {
formatDisplay: function(propertyValue) {
var propertyType = typeof (propertyValue),
result = propertyValue;
if (null === result) {
result = "null";
}
else if ("string" === propertyType) {
result = "\"" + result + "\"";
}
return result;
}
};
$("#reflectTemplate").tmpl(data, templateFunctions).appendTo($(".results"));