从 URLSearchParams 获取对象数组
Get array of objects from URLSearchParams
我需要从 URL 字符串中提取 filter
这是一个对象数组:
http://localhost:3006/menus?page=1&filter[0][id]=MenuID&filter[0][value]=2&filter[1][id]=ParentMenuName&filter[1][value]=u
.
这是我目前拥有的:
const location = useLocation();
const searchParams = new URLSearchParams(location.search);
const filterParamsValue = searchParams.getAll('filter'); // returns []
这就是我想从filter
得到的:
[ { id: 'MenuID', value: '2' }, { id: 'ParentMenuName', value: 'u' } ]
一些快速运行: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(/\[([a-z]+)\]/)[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"}
}
*/
这为您提供了过滤器的对象。
如果需要数组,可以转换为:
/**
* get object of filters and make an array of filters
*/
const arrayOfFilters = []
for(key in filters) {
arrayOfFilters.push(filters[key])
}
console.log(arrayOfFilters)
我写了一个原型函数来解析对象的方括号数组。
此函数是动态解析括号,对嵌套对象有好处
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'])
结果:
{
"0": {
"id": "MenuID",
"value": "2"
},
"1": {
"id": "ParentMenuName",
"value": "u"
}
}
一个简短的版本
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
}
我需要从 URL 字符串中提取 filter
这是一个对象数组:
http://localhost:3006/menus?page=1&filter[0][id]=MenuID&filter[0][value]=2&filter[1][id]=ParentMenuName&filter[1][value]=u
.
这是我目前拥有的:
const location = useLocation();
const searchParams = new URLSearchParams(location.search);
const filterParamsValue = searchParams.getAll('filter'); // returns []
这就是我想从filter
得到的:
[ { id: 'MenuID', value: '2' }, { id: 'ParentMenuName', value: 'u' } ]
一些快速运行: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(/\[([a-z]+)\]/)[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"}
}
*/
这为您提供了过滤器的对象。 如果需要数组,可以转换为:
/**
* get object of filters and make an array of filters
*/
const arrayOfFilters = []
for(key in filters) {
arrayOfFilters.push(filters[key])
}
console.log(arrayOfFilters)
我写了一个原型函数来解析对象的方括号数组。 此函数是动态解析括号,对嵌套对象有好处
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'])
结果:
{
"0": {
"id": "MenuID",
"value": "2"
},
"1": {
"id": "ParentMenuName",
"value": "u"
}
}
一个简短的版本
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
}