JS Query string to (nested) object conversion

(c) All rights reserved.

by PhilQ

JavaScript

const encodeURIButKeepCommas = (v) =>
  encodeURIComponent(v).replaceAll("%2C", ",");

const getQueryStringFromParamsObject = (
  params,
  default_params,
  allowed_params,
) => {
  default_params = default_params ?? {};
  allowed_params =
    allowed_params && Array.isArray(allowed_params)
      ? allowed_params
      : Object.keys({
          ...default_params,
          ...params,
        });

  return allowed_params
    .map((k) => {
      let v = null;
      if (k in params) {
        v = params[k];
      } else if (k in default_params) {
        v = default_params[k];
      } else {
        // Skip
        return false;
      }

      if (Array.isArray(v)) {
        return v.length > 0
          ? v
              .map((vv, kk) => `${k}[${kk}]=${encodeURIButKeepCommas(vv)}`)
              .join("&")
          : `${k}=`;
      } else if (v && typeof v === "object") {
        let entries = [...Object.entries(v)];
        return entries.length > 0
          ? entries
              .map(([kk, vv]) => `${k}[${kk}]=${encodeURIButKeepCommas(vv)}`)
              .join("&")
          : `${k}=`;
      } else if (v === null || v === undefined) {
        // Skip
        return false;
      } else {
        return `${k}=${encodeURIButKeepCommas(v)}`;
      }
    })
    .filter((v) => v !== false)
    .join("&");
};

const getParamsObjectFromQueryString = (queryString) => {
  let params = {};

  (queryString || "")
    .replaceAll(/(^\s*\??|\s+$)/g, "")
    .split("&")
    .forEach((p) => {
      let o = params;

      const [k, v] = [...p.split("="), ""].slice(0, 2);
      const keys = k
        .split(/(?=\[)/)
        .map((k, i) => (i > 0 ? k.slice(1, -1) : k));
      const lastKey = keys[keys.length - 1];

      keys.forEach((sk, i) => {
        if (i === keys.length - 1) {
          return; // Skip last to use as reference later.
        }

        if (sk.length) {
          // If index is numeric, check that parent is an Array.
          if...