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...