You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.6 KiB
57 lines
1.6 KiB
8 months ago
|
var isSorted = require('./isSorted');
|
||
|
var defaults = require('./defaults');
|
||
|
var keys = require('./keys');
|
||
|
var isArr = require('./isArr');
|
||
|
var isObj = require('./isObj');
|
||
|
exports = function(obj) {
|
||
|
var options =
|
||
|
arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
||
|
defaults(options, defOpts);
|
||
|
var deep = options.deep,
|
||
|
comparator = options.comparator;
|
||
|
var visited = [];
|
||
|
var visitedResult = [];
|
||
|
function sort(obj) {
|
||
|
var idx = visited.indexOf(obj);
|
||
|
if (idx > -1) {
|
||
|
return visitedResult[idx];
|
||
|
}
|
||
|
var result;
|
||
|
if (isArr(obj)) {
|
||
|
result = [];
|
||
|
visited.push(obj);
|
||
|
visitedResult.push(result);
|
||
|
for (var i = 0, len = obj.length; i < len; i++) {
|
||
|
var value = obj[i];
|
||
|
if (deep && isObj(value)) {
|
||
|
result[i] = sort(value);
|
||
|
} else {
|
||
|
result[i] = value;
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
result = {};
|
||
|
visited.push(obj);
|
||
|
visitedResult.push(result);
|
||
|
var _keys = keys(obj).sort(comparator);
|
||
|
for (var _i = 0, _len = _keys.length; _i < _len; _i++) {
|
||
|
var key = _keys[_i];
|
||
|
var _value = obj[key];
|
||
|
if (deep && isObj(_value)) {
|
||
|
result[key] = sort(_value);
|
||
|
} else {
|
||
|
result[key] = _value;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
return sort(obj);
|
||
|
};
|
||
|
var defOpts = {
|
||
|
deep: false,
|
||
|
comparator: isSorted.defComparator
|
||
|
};
|
||
|
|
||
|
module.exports = exports;
|