16

I am new to Mustache, please bear with me :)

I have an array in my JSON

"prop":{"brands":["nike","adidas","puma"]}

if I have the template like this

{{#prop}}
 <b>{{brands}}</b>
{{prop}}

and I want to get something like:

<b>nike</b>
<b>adidas</b>
<b>puma</b>

I understand the elements in the array are not hash key-value pairs, however I am wondering if there is anyway in mustache that I can iterate through the elements.

Thanks!

3 Answers 3

41

Here is a working fiddle: http://jsfiddle.net/Qa4UX/

Basically, you need to iterate over the brands array. Since your array is raw and does not have objects inside you have to reference each string like so:

{{#props}}
  <ul>
  {{#brands}}
    <li>
    {{#.}}
        <b>{{.}}</b>
    {{/.}}
    </li>
  {{/brands}}
  </ul>
{{/props}}

You can also find many more examples over here: https://github.com/janl/mustache.js#mustachejs---logic-less-mustache-templates-with-javascript

Sign up to request clarification or add additional context in comments.

6 Comments

thanks for the answer Paul, I see your point and think it would be a solution, however I can't seem to get the fiddle example to produce html result whenI hit "run", but a very nice solution, thanks!
hi. Just out of curiosity: Don't you see the list in the html frame in jsfiddle?
Nope, <div id="testmustache"></div> is all I see, and the "Run" link does nothing to it...
I've updated the fiddle. The problem was that mustache was not loaded in Chrome, but worked in Safari. I changed the mustache source and now it should work
Thank you for this and the JS-Fiddle. Is the {{#.}} and {{/.}} part mandatory/best practice ? I couldn't find documentation on this
|
24

This works

{{#json.props.brands}}
<h1>{{.}}</h1>
{{/json.props.brands}}

{{.}} When looping over an array of strings, a . can be used to refer to the current item in the list.

Comments

9

mustache is logicless, so writing your own iteration/loop in it is impossible. It is easy to convert your JSON though. For example:

var json = '{"prop":{"brands":["nike","adidas","puma"]}}';
var obj = JSON.parse(json);
var data = {brands: obj.prop['brands'].map(function(x){ return {name: x}; })};

Gives you a data variable which will work with the template:

{{#brands}}
  <b>{{name}}</b>
{{/brands}}

1 Comment

Thanks, parsing the JSON before hand seems to be the best solution.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.