diff --git a/src/util/underscore.js b/src/util/underscore.js index 85f9b54fb..f3c9a442b 100644 --- a/src/util/underscore.js +++ b/src/util/underscore.js @@ -94,6 +94,15 @@ function isObject (value) { return value !== null && typeof value === 'object' } +/* + * Checks if value's prototype is Object or undefined. + * @param {any} value The value to check. + * @return {Boolean} Returns true if value is a plain object, else false. + */ +function isPlainObject(value) { + return value && !value.constructor || value.constructor === Object +} + /* * A function to create flexibly-numbered lists of integers, * handy for each and map loops. start, if omitted, defaults to 0; step defaults to 1. @@ -119,6 +128,7 @@ function range (start, stop, step) { exports.isString = isString exports.isArray = isArray exports.isObject = isObject +exports.isPlainObject = isPlainObject exports.isError = isError exports.range = range diff --git a/tags/for.js b/tags/for.js index 1fb49996d..42cdb8dd3 100644 --- a/tags/for.js +++ b/tags/for.js @@ -1,6 +1,7 @@ const Liquid = require('..') const lexical = Liquid.lexical const mapSeries = require('../src/util/promise.js').mapSeries +const isPlainObject = require('../src/util/underscore.js').isPlainObject const RenderBreakError = Liquid.Types.RenderBreakError const assert = require('../src/util/assert.js') const re = new RegExp(`^(${lexical.identifier.source})\\s+in\\s+` + @@ -38,8 +39,10 @@ module.exports = function (liquid) { render: function (scope, hash) { var collection = Liquid.evalExp(this.collection, scope) - if (!Array.isArray(collection) || - (Array.isArray(collection) && collection.length === 0)) { + if (isPlainObject(collection)) { + collection = Object.keys(collection) + } + if (!Array.isArray(collection) || !collection.length) { return liquid.renderer.renderTemplates(this.elseTemplates, scope) }