diff --git a/grails-app/assets/javascripts/forms.js b/grails-app/assets/javascripts/forms.js index de9a20c..f498e96 100644 --- a/grails-app/assets/javascripts/forms.js +++ b/grails-app/assets/javascripts/forms.js @@ -297,6 +297,21 @@ function orEmptyArray(v) { }; parser.functions.deepEquals = function(value1, value2) { + // Sort arrays in nested objects to ensure that lodash compares arrays correctly + function sortArraysInObject(obj) { + if (Array.isArray(obj)) { + obj.sort(); + } else if (typeof obj === 'object' && obj !== null) { + for (var key in obj) { + sortArraysInObject(obj[key]); // Recursively call to sort arrays in nested objects + } + } + + return obj; + } + + sortArraysInObject(value1); + sortArraysInObject(value2); return _.isEqual(value1, value2); }; diff --git a/src/test/js/spec/ExpressionSpec.js b/src/test/js/spec/ExpressionSpec.js index 472e8eb..1feb491 100644 --- a/src/test/js/spec/ExpressionSpec.js +++ b/src/test/js/spec/ExpressionSpec.js @@ -124,4 +124,27 @@ describe("Expression Spec", function () { }); + it("Should be able to compare two unsorted arrays", function() { + var data = { + a: [1, 2, 3], + b: [3, 2, 1] + }; + var result = ecodata.forms.expressionEvaluator.evaluateBoolean("deepEquals(a, b)", data); + expect(result).toEqual(true); + + data = { + a: {c: [1, 2, 3]}, + b: {c: [3, 2, 1]} + }; + var result = ecodata.forms.expressionEvaluator.evaluateBoolean("deepEquals(a, b)", data); + expect(result).toEqual(true); + + data = { + a: {c: [1, 2]}, + b: {c: [3, 2, 1]} + }; + var result = ecodata.forms.expressionEvaluator.evaluateBoolean("deepEquals(a, b)", data); + expect(result).toEqual(false); + }) + }); \ No newline at end of file