sortKeys.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. var isSorted = require('./isSorted');
  2. var defaults = require('./defaults');
  3. var keys = require('./keys');
  4. var isArr = require('./isArr');
  5. var isObj = require('./isObj');
  6. exports = function(obj) {
  7. var options =
  8. arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  9. defaults(options, defOpts);
  10. var deep = options.deep,
  11. comparator = options.comparator;
  12. var visited = [];
  13. var visitedResult = [];
  14. function sort(obj) {
  15. var idx = visited.indexOf(obj);
  16. if (idx > -1) {
  17. return visitedResult[idx];
  18. }
  19. var result;
  20. if (isArr(obj)) {
  21. result = [];
  22. visited.push(obj);
  23. visitedResult.push(result);
  24. for (var i = 0, len = obj.length; i < len; i++) {
  25. var value = obj[i];
  26. if (deep && isObj(value)) {
  27. result[i] = sort(value);
  28. } else {
  29. result[i] = value;
  30. }
  31. }
  32. } else {
  33. result = {};
  34. visited.push(obj);
  35. visitedResult.push(result);
  36. var _keys = keys(obj).sort(comparator);
  37. for (var _i = 0, _len = _keys.length; _i < _len; _i++) {
  38. var key = _keys[_i];
  39. var _value = obj[key];
  40. if (deep && isObj(_value)) {
  41. result[key] = sort(_value);
  42. } else {
  43. result[key] = _value;
  44. }
  45. }
  46. }
  47. return result;
  48. }
  49. return sort(obj);
  50. };
  51. var defOpts = {
  52. deep: false,
  53. comparator: isSorted.defComparator
  54. };
  55. module.exports = exports;