stringify.js

  1. import isPlainObject from 'lodash.isplainobject';
  2. import isFunction from 'lodash.isfunction';
  3. import { default as isArray } from './is-array';
  4. function safe(fn) {
  5. return function () {
  6. var args = [];
  7. for (var _i = 0; _i < arguments.length; _i++) {
  8. args[_i] = arguments[_i];
  9. }
  10. try {
  11. // tslib 不支持
  12. // eslint-disable-next-line prefer-spread
  13. return fn.apply(null, args);
  14. }
  15. catch (error) {
  16. return args[0];
  17. }
  18. };
  19. }
  20. function stringifyPrimitive(v) {
  21. if (typeof v === 'string')
  22. return v;
  23. if (typeof v === 'number' && isFinite(v))
  24. return v;
  25. if (typeof v === 'boolean')
  26. return v ? 'true' : 'false';
  27. if (typeof v === 'object')
  28. return JSON.stringify(v);
  29. return '';
  30. }
  31. /**
  32. * 将对象转换成 query string
  33. *
  34. * @param {object} obj 需要序列化成 URL query string 的对象。属性值支持数组。
  35. * @param {string} sep 用于界定键值对的子字符串。默认为 '&'
  36. * @param {string} eq 用于界定 key 和 value 的子字符串。默认为 '='
  37. * @param {object} options 自定义编码行为
  38. * @param {function} options.encodeURIComponent 用于自定义的 encodeURIComponent
  39. * @returns {string}
  40. *
  41. * @example
  42. *
  43. * stringify({})
  44. * // => ''
  45. *
  46. * stringify({key: 'value', undef: undefined })
  47. * // => 'key=value&undef='
  48. */
  49. function stringify(obj, options) {
  50. if (options === void 0) { options = {}; }
  51. if (!isPlainObject(obj)) {
  52. return '';
  53. }
  54. var _a = options || {}, _b = _a.sep, sep = _b === void 0 ? '&' : _b, _c = _a.eq, eq = _c === void 0 ? '=' : _c;
  55. var encode = safe(encodeURIComponent);
  56. if (options && isFunction(options.encodeURIComponent)) {
  57. // @ts-ignore TODO:
  58. encode = safe(options.encodeURIComponent);
  59. }
  60. var keys = Object.keys(obj);
  61. var len = keys.length;
  62. var fields = '';
  63. for (var i = 0; i < len; i++) {
  64. var k = keys[i];
  65. var v = obj[k];
  66. var ks = encode(stringifyPrimitive(k));
  67. ks += eq;
  68. if (isArray(v)) {
  69. var vlen = v.length;
  70. if (vlen === 0)
  71. continue;
  72. for (var j = 0; j < vlen; j++) {
  73. fields += ks;
  74. fields += encode(stringifyPrimitive(v[j]));
  75. if (j < vlen - 1) {
  76. fields += sep;
  77. }
  78. }
  79. }
  80. else {
  81. fields += ks;
  82. fields += encode(stringifyPrimitive(v));
  83. }
  84. if (i < len - 1) {
  85. fields += sep;
  86. }
  87. }
  88. return fields;
  89. }
  90. export default stringify;
  91. //# sourceMappingURL=stringify.js.map