summaryrefslogtreecommitdiffstats
path: root/lib/handlebars/base.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/handlebars/base.js')
-rw-r--r--lib/handlebars/base.js45
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);
+ }
}
}