Я не знаю, как это сделать прямо из вашего объекта без каких-либо вспомогательных переменных. Вот что вы МОЖЕТЕ сделать до передачи данных в шаблон, чтобы избежать необходимости связываться с кодом, который генерирует исходный объект JSON.
Пусть это будет ваш JSON объект:
var data = {
test: [ "test1", "test2", "test3" ]
}
Пусть это будет ваш шаблон усов:
{{#isArray}}
{{#test}} <li>{{.}}</li>{{/test}}
{{/isArray}}
{{^isArray}}
{{test}}
{{/isArray}}
Пусть это будет ваш код, который компилирует/называет шаблон усов (я использую документ .body.innerHTML, потому что именно так я создал пример JSFIDDLE):
var template = document.body.innerHTML;
document.body.innerHTML = Mustache.render(template, data);
abov Настройка электронной напечатает следующее, потому что isArray
не определен, поэтому он будет выполнять блок, который сводит на нет isArray
с ^
символа (например, он будет обрабатывать данные в виде строки, даже если это массив):
test1,test2,test3
Я предлагаю, если вы не хотите прикасаться к коду, который генерирует JSON, что вы добавляете некоторый javascript перед вызовом Mustache.render
, чтобы установить свойство isArray
. Вот как я бы проверить существование метода pop
для того, чтобы установить isArray
правильно перед передачей данных в шаблон:
if (data.test.pop) { data.isArray = 1; } else { data.isArray = 0; }
var template = document.body.innerHTML;
document.body.innerHTML = Mustache.render(template, data);
Это будет правильно распечатать искомые элементы Li:
test1
test2
test3
Я положил рабочий пример здесь упражнения как экземпляры массива и строковые в элементе данных, чтобы показать, что решение работает:
http://jsfiddle.net/s7Wne/1/
Я всегда иду по одноэлементному массиву ... –