Проверка того, что возвращается в функции Javascript - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь обернуть голову тем, что возвращает эта функция. В настоящее время разбить его построчно.

function a(arg) {
  return arg.replace(/^\?/, ")
    .split('&')
    .map(p => {
      const [k,v] = p.split('=');
      return { [k]: v };
    })
    .reduce((o, item) => ({ ...o, ...item}), {});
}
  1. Таким образом, все выглядит как "arg", все "?"заменяются кавычками.
  2. Затем аргумент разделяется на '&'.

Здесь вещи становятся туманными. Каждый символ в аргументах помещается в новый массив в каждом "=", где k является ключом массива? Кроме того, я не совсем уверен, что накапливается в функции .reduce.

Любая помощь приветствуется в улучшении моего путешествия по JS. Спасибо

1 Ответ

2 голосов
/ 04 ноября 2019

Функция ожидает, что каждая подстрока между & 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'));
...