diff options
Diffstat (limited to 'lib/handlebars/base.js')
-rw-r--r-- | lib/handlebars/base.js | 45 |
1 files changed, 26 insertions, 19 deletions
diff --git a/lib/handlebars/base.js b/lib/handlebars/base.js index cec2937..50aa3f8 100644 --- a/lib/handlebars/base.js +++ b/lib/handlebars/base.js @@ -117,36 +117,43 @@ function registerDefaultHelpers(instance) { data = createFrame(options.data); } + function execIteration(key, i, last) { + if (data) { + data.key = key; + data.index = i; + data.first = i === 0; + data.last = !!last; + + if (contextPath) { + data.contextPath = contextPath + key; + } + } + ret = ret + fn(context[key], { data: data }); + } + if(context && typeof context === 'object') { if (isArray(context)) { for(var j = context.length; i<j; i++) { - if (data) { - data.index = i; - data.first = (i === 0); - data.last = (i === (context.length-1)); - - if (contextPath) { - data.contextPath = contextPath + i; - } - } - ret = ret + fn(context[i], { data: data }); + execIteration(i, i, i === context.length-1); } } else { + var priorKey; + for(var key in context) { if(context.hasOwnProperty(key)) { - if(data) { - data.key = key; - data.index = i; - data.first = (i === 0); - - if (contextPath) { - data.contextPath = contextPath + key; - } + // We're running the iterations one step out of sync so we can detect + // the last iteration without have to scan the object twice and create + // an itermediate keys array. + if (priorKey) { + execIteration(priorKey, i-1); } - ret = ret + fn(context[key], {data: data}); + priorKey = key; i++; } } + if (priorKey) { + execIteration(priorKey, i-1, true); + } } } |