Но пусть будет целое. Что intval сделает со строкой "00018446744073709551616"?
const params = new URLSearchParams(str);
const obj = Object.fromEntries(Array.from(
new Set(params.keys()),
n => [
n.replace(/\[\]$/, ''),
n.endsWith('[]')
? params.getAll(n)
: params.get(n)
]
));