Вопрос №55681 от пользователя Дмитрий Епихин в уроке «Объекты-Сущности, Объекты-Значения и внедренные объекты», курс «JS: Объектно-ориентированный дизайн»

Дмитрий Епихин

Вопрос по упражнению:

URL {
      href: 'http://yandex.ru/?key=value&key2=value2',
      origin: 'http://yandex.ru',
      protocol: 'http:',
      username: '',
      password: '',
      host: 'yandex.ru',
      hostname: 'yandex.ru',
      port: '',
      pathname: '/',
      search: '?key=value&key2=value2',
      searchParams: URLSearchParams { 'key' => 'value', 'key2' => 'value2' },
      hash: ''
    }

// Везде пары ключ-значение кроме "searchParams: URLSearchParams { 'key' => 'value', 'key2' => 'value2' },".
// Что это за конструкция? Зачем она? Как с ней работать?

// В частности, я не понял как работает вот эта конструкция из решения учителя: "Object.fromEntries(this.url.searchParams)".
// Разве Object.fromEntries не должен принимать массив пар ключ-значение по типу: "[ ['0', 'a'], ['1', 'b'], ['2', 'c'] ]"?

// В связи с этим, я делал вот так.
// (нашел такой пример в документации, не до конца понимая, как это работает).

getQueryParam(key, ifAbsent = null) {
  const params = new URLSearchParams(this.url.search);
  return params.has(key) ? params.get(key) : ifAbsent;
}

Еще момент. Линтеру не нравится мой for...of, a forEach почему-то не работает. https://ru.hexlet.io/code_reviews/420562

5 0

Maksim Litvinov

Да, вы правы. В объекте класса URL в свойстве searchParams находится не примитивное значение, а объект класса URLSearchParams. Это объект, который позволяет удобно работать с параметрами строки запроса. Работать с ним можно при помощи методов, которые он предоставляет. Вот документация по нему: https://nodejs.org/api/url.html#url_class_urlsearchparams.

Метод Object.fromEntries() принимает на вход не только массив пар [ключ, значение], но и любой итерируемый объект. А объект класса URLSearchParams как раз и является итерируемым (т.е. реализует интерфейс iterable). Поэтому такая конструкция позволяет получить обычный объект. Сделать при мощи цикла, как вы, тоже не воспрещается.

const params = new URLSearchParams(this.url.search);

Посмотрите на структуру объекта класса URL, которую вы привели в самом начале. Свойство searchParams уже содержит объект класса URLSearchParams, не обязательно было создавать его руками из строки. Это не ошибка, просто лишний промежуточный шаг получился

Метод forEach работать, но без ревью тяжело сказать, что пошло не так.

1

Дмитрий Епихин

Максим Литвинов, спасибо за ответ!

Вот ревью с forEach: https://ru.hexlet.io/code_reviews/420562

Видимо, проблема в том что возвращается не массив, а какой-то итератор. Что это вообще такое? :)

 URLSearchParams Iterator { [ 'a', 'b' ], [ 'c', 'd' ], [ 'lala', 'value' ] }
0

Maksim Litvinov

Да, действительно, метод URLSearchParams.entries() возвращает не массив, а итератор, поэтому стандартным методом массива его перебрать не получится, а for...of позволяет это сделать. Обратите внимание, у объекта класса URLSearchParams есть собственный метод forEach(). Попробуйте воспользоваться им.

1

Дмитрий Епихин

Максим Литвинов, сделал при помощи forEach. https://ru.hexlet.io/code_reviews/420562

Есть вопрос:

// Не понял почему аргументы в колбек нужно передавать именно в такой последовательности - первым value, а вторым key.
// Это особенность метода? Это странно и сбивает с толку.
params.forEach((value, key) => {
      result[key] = value;
    });
0

Maksim Litvinov

Да, такая сигнатура у этого метода:

searchParams.forEach(function(value, key) {
  console.log(value, key);
});

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

1

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Фронтенд-разработчик
Профессия
Разработка фронтенд-компонентов веб-приложений
25 мая 10 месяцев
Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
25 мая 10 месяцев
Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
25 мая 10 месяцев
Иконка программы Node.js-разработчик
Профессия
Разработка бэкенд-компонентов веб-приложений
25 мая 10 месяцев
Иконка программы Fullstack-разработчик
Профессия
Новый
Разработка фронтенд и бэкенд компонентов веб-приложений
25 мая 16 месяцев
Иконка программы Верстальщик
Профессия
Вёрстка с использованием последних стандартов CSS
в любое время 5 месяцев
Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
25 мая 10 месяцев
Иконка программы Разработчик на Ruby on Rails
Профессия
Создает веб-приложения со скоростью света
25 мая 5 месяцев