Skip to content

Commit

Permalink
Fixed behavior for deep sort of circular objects
Browse files Browse the repository at this point in the history
Fixes issues detailed in issues #2 and #3.

Closes #4
  • Loading branch information
nathanfdunn authored and sindresorhus committed May 18, 2016
1 parent 593116b commit b698b51
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 1 deletion.
13 changes: 12 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,27 @@ module.exports = function (obj, opts) {
}

var deep = opts.deep;
var seenInput = [];
var seenOutput = [];

var sortKeys = function (x) {
var seenIndex = seenInput.indexOf(x);

if (seenIndex !== -1) {
return seenOutput[seenIndex];
}

var ret = {};
var keys = Object.keys(x).sort(opts.compare);

seenInput.push(x);
seenOutput.push(ret);

for (var i = 0; i < keys.length; i++) {
var key = keys[i];
var val = x[key];

ret[key] = deep && val !== x && isPlainObj(val) ? sortKeys(val) : val;
ret[key] = deep && isPlainObj(val) ? sortKeys(val) : val;
}

return ret;
Expand Down
28 changes: 28 additions & 0 deletions test.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,34 @@ it('deep option', function () {
sortKeys(obj, {deep: true});
});

var obj = {z: 0};
obj.circular = obj;
var sortedObj = sortKeys(obj, {deep: true});
assert.strictEqual(sortedObj, sortedObj.circular);
assert.strictEqual(
JSON.stringify(Object.keys(sortedObj)),
JSON.stringify(['circular', 'z'])
);

var obj1 = {b: 0};
var obj2 = {d: 0};
obj1.a = obj2;
obj2.c = obj1;

assert.doesNotThrow(function () {
sortKeys(obj1, {deep: true});
sortKeys(obj2, {deep: true});
});

var sorted1 = sortKeys(obj1, {deep: true});
var sorted2 = sortKeys(obj2, {deep: true});

assert.strictEqual(sorted1, sorted1.a.c);
assert.strictEqual(
JSON.stringify(Object.keys(sorted1)),
JSON.stringify(['a', 'b'])
);

assert.strictEqual(
JSON.stringify(sortKeys({c: {c: 0, a: 0, b: 0}, a: 0, b: 0, z: [9, 8, 7, 6, 5]}, {deep: true})),
JSON.stringify({a: 0, b: 0, c: {a: 0, b: 0, c: 0}, z: [9, 8, 7, 6, 5]})
Expand Down

0 comments on commit b698b51

Please sign in to comment.