Necesito extraer el filter , que es una matriz de objetos de una cadena de URL:
http://localhost:3006/menus?page=1&filter[0][id]=MenuID&filter[0][value]=2&filter[1][id]=ParentMenuName&filter[1][value]=u .
Esto es lo que tengo actualmente:
const location = useLocation(); const searchParams = new URLSearchParams(location.search); const filterParamsValue = searchParams.getAll('filter'); // returns [] Esto es lo que quiero obtener del filter :
[ { id: 'MenuID', value: '2' }, { id: 'ParentMenuName', value: 'u' } ]Un poco de funcionamiento rápido :D ...
let s = `http://localhost:3006/menus?page=1&filter[0][id]=MenuID&filter[0][value]=2&filter[1][id]=ParentMenuName&filter[1][value]=u` // get just array of strings like ['filter[0][id]=MenuID', ...] let arr = s.split(/\&/).slice(1) let filters = {} arr.forEach(f => { const id = f.match(/\[([\d]+)\]/)[1] const prop = f.match(/\[([az]+)\]/)[1] if(filters[id]) { filters[id][prop] = f.match(/=([\w]+)/)[1] } else { filters[id] = {} filters[id][prop] = f.match(/=([\w]+)/)[1] } }) // show filters object: console.dir( filters ) /* { 0: { id: "MenuID", value: "2"}, 1: { id: "ParentMenuName", value: "u"} } */Esto le da Objeto de filtros. Si necesita una matriz, puede convertirla como:
/** * get object of filters and make an array of filters */ const arrayOfFilters = [] for(key in filters) { arrayOfFilters.push(filters[key]) } console.log(arrayOfFilters)Escribí una función prototipo para analizar la matriz de corchetes de objetos. Esta función analiza dinámicamente los corchetes, lo que es bueno para objetos anidados
URLSearchParams.prototype.toObject = function () { let _obj = {}; const bracketToDots = function (str) { return str.replaceAll('[', '.').replaceAll(']', '') } const parseDotNotation = function (str, val, obj) { let currentObj = obj, keys = str.split("."), i, l = Math.max(1, keys.length - 1), key; if (l === 1) { key = keys[0]; currentObj[key] = val; } else { for (i = 0; i < l; ++i) { key = keys[i]; currentObj[key] = currentObj[key] || {}; currentObj = currentObj[key]; } currentObj[keys[i]] = val; } } for (const [key, value] of this.entries()) { parseDotNotation(bracketToDots(key), value, _obj); } return _obj; } const lo = new URL('http://localhost:3006/menus?page=1&filter[0][id]=MenuID&filter[0][value]=2&filter[1][id]=ParentMenuName&filter[1][value]=u'); const searchParams = new URLSearchParams(lo.search); const params = searchParams.toObject(); console.log(params['filter'])Resultado:
{ "0": { "id": "MenuID", "value": "2" }, "1": { "id": "ParentMenuName", "value": "u" } }una versión corta
function getSearchParameters () { const url = new URL(window.location) const searchParams = new URLSearchParams(url.search) const paramObj = {} for (const key of searchParams.keys()) { paramObj[key] = searchParams.getAll(key).length > 1 ? searchParams.getAll(key) : searchParams.get(key) } return paramObj }