queryToObject.js 1.7 KB

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