Функция ожидает, что каждая подстрока между &
s будет иметь значение слева и справа от знака =
, например:
foo=fooVal&bar=barVal&baz=bazVal
// ^ ^ ^
После разделения, что .map
делает это помещает значение слева от =
в качестве ключа внутри объекта и помещает значение справа от =
в качестве значения для этого ключа, например
foo=fooVal&bar=barVal&baz=bazVal
превращается в
[
{ foo: 'fooVal' },
{ bar: 'barVal' },
{ baz: 'bazVal' },
]
Тогда .reduce
объединяет эти объекты в один:
{
foo: 'fooVal',
bar: 'barVal',
baz: 'bazVal',
}
Может быть легче понять без .map
и .reduce
:
function a(arg) {
const obj = {};
for (const substr of arg.replace(/^\?/, '').split('&')) {
const [key, val] = substr.split('=');
obj[key] = val;
}
return obj;
}
console.log(a('?foo=fooVal&bar=barVal&baz=bazVal'));