diff --git a/lib/model.js b/lib/model.js index 9160f6f..e9f6a80 100644 --- a/lib/model.js +++ b/lib/model.js @@ -163,6 +163,8 @@ function compareArrays (a, b) { * Return -1 if a < b, 1 if a > b and 0 if a = b (note that equality here is NOT the same as defined in areThingsEqual!) */ function compareThings (a, b) { + var aKeys, bKeys, comp, i; + // null is less than everything except null if (a === null) { return b === null ? 0 : -1; } if (b === null) { return a === null ? 0 : 1; } @@ -186,6 +188,18 @@ function compareThings (a, b) { // Arrays (first element is most significant and so on) if (util.isArray(a)) { return util.isArray(b) ? compareArrays(a, b) : -1; } if (util.isArray(b)) { return util.isArray(a) ? compareArrays(a, b) : 1; } + + // Objects + aKeys = Object.keys(a).sort(); + bKeys = Object.keys(b).sort(); + + for (i = 0; i < Math.min(aKeys.length, bKeys.length); i += 1) { + comp = compareThings(a[aKeys[i]], b[bKeys[i]]); + + if (comp !== 0) { return comp; } + } + + return compareNSB(aKeys.length, bKeys.length); } diff --git a/test/model.test.js b/test/model.test.js index e2d1b16..23c27e7 100644 --- a/test/model.test.js +++ b/test/model.test.js @@ -329,7 +329,7 @@ describe('Model', function () { }); // ==== End of 'Modifying documents' ==== // - describe.only('Comparing things', function () { + describe('Comparing things', function () { it('null is less than everything except null', function () { var otherStuff = ["string", "", -1, 0, 5.3, 12, true, false, new Date(12345), {}, { hello: 'world' }, [], ['quite', 5]]; @@ -436,6 +436,14 @@ describe('Model', function () { }); }); + it('And finally objects', function () { + model.compareThings({}, {}).should.equal(0); + model.compareThings({ a: 42 }, { a: 312}).should.equal(-1); + model.compareThings({ a: '42' }, { a: '312'}).should.equal(1); + model.compareThings({ a: 42, b: 312 }, { b: 312, a: 42 }).should.equal(0); + model.compareThings({ a: 42, b: 312, c: 54 }, { b: 313, a: 42 }).should.equal(-1); + }); + }); // ==== End of 'Comparing things' ==== //