queryToObject.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import defined from './defined.js';
  2. import DeveloperError from './DeveloperError.js';
  3. import isArray from './isArray.js';
  4. /**
  5. * Parses a query string into an object, where the keys and values of the object are the
  6. * name/value pairs from the query string, decoded. If a name appears multiple times,
  7. * the value in the object will be an array of values.
  8. * @exports queryToObject
  9. *
  10. * @param {String} queryString The query string.
  11. * @returns {Object} An object containing the parameters parsed from the query string.
  12. *
  13. *
  14. * @example
  15. * var obj = Cesium.queryToObject('key1=some%20value&key2=a%2Fb&key3=x&key3=y');
  16. * // obj will be:
  17. * // {
  18. * // key1 : 'some value',
  19. * // key2 : 'a/b',
  20. * // key3 : ['x', 'y']
  21. * // }
  22. *
  23. * @see objectToQuery
  24. */
  25. function queryToObject(queryString) {
  26. //>>includeStart('debug', pragmas.debug);
  27. if (!defined(queryString)) {
  28. throw new DeveloperError('queryString is required.');
  29. }
  30. //>>includeEnd('debug');
  31. var result = {};
  32. if (queryString === '') {
  33. return result;
  34. }
  35. var parts = queryString.replace(/\+/g, '%20').split(/[&;]/);
  36. for (var i = 0, len = parts.length; i < len; ++i) {
  37. var subparts = parts[i].split('=');
  38. var name = decodeURIComponent(subparts[0]);
  39. var value = subparts[1];
  40. if (defined(value)) {
  41. value = decodeURIComponent(value);
  42. } else {
  43. value = '';
  44. }
  45. var resultValue = result[name];
  46. if (typeof resultValue === 'string') {
  47. // expand the single value to an array
  48. result[name] = [resultValue, value];
  49. } else if (isArray(resultValue)) {
  50. resultValue.push(value);
  51. } else {
  52. result[name] = value;
  53. }
  54. }
  55. return result;
  56. }
  57. export default queryToObject;