index.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. var json = typeof JSON !== 'undefined' ? JSON : require('jsonify');
  2. module.exports = function (obj, opts) {
  3. if (!opts) opts = {};
  4. if (typeof opts === 'function') opts = { cmp: opts };
  5. var cmp = opts.cmp && (function (f) {
  6. return function (node) {
  7. return function (a, b) {
  8. var aobj = { key: a, value: node[a] };
  9. var bobj = { key: b, value: node[b] };
  10. return f(aobj, bobj);
  11. };
  12. };
  13. })(opts.cmp);
  14. return (function stringify (node) {
  15. if (typeof node !== 'object' || node === null) {
  16. return json.stringify(node);
  17. }
  18. if (isArray(node)) {
  19. var out = [];
  20. for (var i = 0; i < node.length; i++) {
  21. out.push(stringify(node[i]));
  22. }
  23. return '[' + out.join(',') + ']';
  24. }
  25. else {
  26. var keys = objectKeys(node).sort(cmp && cmp(node));
  27. var out = [];
  28. for (var i = 0; i < keys.length; i++) {
  29. var key = keys[i];
  30. out.push(stringify(key) + ':' + stringify(node[key]));
  31. }
  32. return '{' + out.join(',') + '}';
  33. }
  34. })(obj);
  35. };
  36. var isArray = Array.isArray || function (x) {
  37. return {}.toString.call(x) === '[object Array]';
  38. };
  39. var objectKeys = Object.keys || function (obj) {
  40. var has = Object.prototype.hasOwnProperty || function () { return true };
  41. var keys = [];
  42. for (var key in obj) {
  43. if (has.call(obj, key)) keys.push(key);
  44. }
  45. return keys;
  46. };