json-abc.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /**
  2. * JSON排序处理
  3. * @author zhaoxianlie
  4. */
  5. window.JsonABC = (function () {
  6. // Is a value an array?
  7. function isArray(val) {
  8. return Object.prototype.toString.call(val) === '[object Array]';
  9. }
  10. // Is a value an Object?
  11. function isPlainObject(val) {
  12. return Object.prototype.toString.call(val) === '[object Object]';
  13. }
  14. /**
  15. * 排序算法
  16. * @param un 需要排序的JSON
  17. * @param asc 是否正序
  18. * @param noarray 不包括数组,默认false
  19. * @returns {{}}
  20. */
  21. function sortObj(un, asc, noarray) {
  22. asc = asc !== -1 ? 1 : -1;
  23. noarray = noarray || false;
  24. let or = {};
  25. // 如果是BigInt的对象,则不参与排序
  26. if (typeof JSON.BigNumber === 'function' && un instanceof JSON.BigNumber) {
  27. return un;
  28. }
  29. if (isArray(un)) {
  30. // Sort or don't sort arrays
  31. if (noarray) {
  32. or = un;
  33. } else {
  34. or = un.sort();
  35. }
  36. or.forEach(function (v, i) {
  37. or[i] = sortObj(v, asc, noarray);
  38. });
  39. if (!noarray) {
  40. or = or.sort(function (a, b) {
  41. a = (typeof a === 'object') ? JSON.stringify(a) : a;
  42. b = (typeof b === 'object') ? JSON.stringify(b) : b;
  43. return a < b ? -1 * asc : (a > b ? 1 * asc : 0);
  44. });
  45. }
  46. } else if (isPlainObject(un)) {
  47. or = {};
  48. Object.keys(un).sort(function (a, b) {
  49. if (a.toLowerCase() < b.toLowerCase()) return -1 * asc;
  50. if (a.toLowerCase() > b.toLowerCase()) return 1 * asc;
  51. return 0;
  52. }).forEach(function (key) {
  53. or[key] = sortObj(un[key], asc, noarray);
  54. });
  55. } else {
  56. or = un;
  57. }
  58. return or;
  59. }
  60. return {
  61. sortObj: sortObj
  62. };
  63. })();