Source: Core/queryToObject.js

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