public/js/util/urlParameters.js (44 lines of code) (raw):
import _get from 'lodash/get';
import _set from 'lodash/set';
export function isValidValue(value) {
if (value === undefined || value === '') {
return false;
}
if (Array.isArray(value) && value.length === 0) {
return false;
}
return true;
}
export function objectToParamString(obj, prefix) {
return Object.keys(obj).reduce(function(soFar, key) {
const value = obj[key];
const encodedKey = encodeURIComponent(prefix ? `${prefix}.${key}`: key);
if (!isValidValue(value)) {
return soFar;
}
if (Array.isArray(value)) {
return soFar.concat(value.map((subValue) => [encodedKey + '[]=' + encodeURIComponent(subValue)]));
} else if (typeof value === 'object') {
return soFar.concat([objectToParamString(value, key)]);
} else {
return soFar.concat([encodedKey + '=' + encodeURIComponent(value)]);
}
}, []).join('&');
}
export function paramStringToObject(string) {
const stringNoQuestion = string[0] === "?" ? string.slice(1, string.length) : string;
const params = stringNoQuestion.split("&");
const paramsObject = params.reduce((paramsObject, param) => {
const splitParam = param.split("=");
if (splitParam.length !== 2) {
return paramsObject; //Not key=value fail fast
}
const rawKey = decodeURIComponent(splitParam[0]);
const rawValue = decodeURIComponent(splitParam[1]);
const isArray = rawKey.indexOf('[]') !== -1;
const key = isArray ? rawKey.replace("[]", '') : rawKey; // Strip off the [] if array
const value = isArray ? _get(paramsObject, key, []).concat([rawValue]) : rawValue; // add to any existing values if array
return Object.assign({}, _set(paramsObject, key, value));
}, {});
return paramsObject;
}