Вопрос №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
Да, вы правы. В объекте класса 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 работать, но без ревью тяжело сказать, что пошло не так.
Максим Литвинов, спасибо за ответ!
Вот ревью с forEach: https://ru.hexlet.io/code_reviews/420562
Видимо, проблема в том что возвращается не массив, а какой-то итератор. Что это вообще такое? :)
URLSearchParams Iterator { [ 'a', 'b' ], [ 'c', 'd' ], [ 'lala', 'value' ] }
Да, действительно, метод URLSearchParams.entries() возвращает не массив, а итератор, поэтому стандартным методом массива его перебрать не получится, а for...of позволяет это сделать. Обратите внимание, у объекта класса URLSearchParams есть собственный метод forEach(). Попробуйте воспользоваться им.
Максим Литвинов, сделал при помощи forEach. https://ru.hexlet.io/code_reviews/420562
Есть вопрос:
// Не понял почему аргументы в колбек нужно передавать именно в такой последовательности - первым value, а вторым key.
// Это особенность метода? Это странно и сбивает с толку.
params.forEach((value, key) => {
result[key] = value;
});
Да, такая сигнатура у этого метода:
searchParams.forEach(function(value, key) {
console.log(value, key);
});
Возможно, это связано с тем, что чаще требуются только значения, без ключей. Тогда можно передать в функцию только один параметр - значения, и не передавать второй
Используйте Хекслет по максимуму!
- Задавайте вопросы по уроку
- Проверяйте знания в квизах
- Проходите практику прямо в браузере
- Отслеживайте свой прогресс
Зарегистрируйтесь или войдите в свой аккаунт
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.







