Как использовать JavaScript и получить параметры строки URL адреса

Как получить параметры строки URL адреса на нативном JavaScript

20.04.2021
175
5 мин.
0

Нативный JavaScript позволяет легко получить параметры строки URL адреса. Его можно преобразовать в объект, содержащий пары ключ/значение. Давайте разберёмся, как это сделать. Например, у нас имеется ссылка.

Создание вспомогательной функции

Начнём с создания вспомогательной функции getParams(). Она будет принимать URL адрес в качестве аргумента. В случае его отсутствия по умолчанию она должна использовать window.location.

function getParams (url = window.location) {
    let params = {}; // Создаем объект для параметров
    return params; // Функция будет возвращать заполненный объект
}

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

Способ получить параметры строки URL адреса

Теперь займёмся извлечением нужных данных из URL. Для этого нам потребуются объекты URL() и URLSearchParams(). Мы не будем подробно рассматривать их в этой статье. Только разберёмся, как можно использовать их для решения нашей задачи.

Объект URLSearchParams() имеет метод forEach(), который можно использовать для циклического перебора всех параметров. С его помощью мы будем получать их и передавать в объект.

URL адрес мы передадим в конструктор new URL(), а затем вызовем метод forEach() для получения свойства searchParams. Внутри метода forEach() мы добавим ключ и его значение в объект. При этом декодировать ничего не потребуется, поскольку объект URLSearchParams() сделает это за нас автоматически.

function getParams (url = window.location) {
    let params = {};

    new URL(url).searchParams.forEach(function (val, key) {
        params[key] = val; // Пушим пары ключ / значение (key / value) в объект
    });
    
    return params;
}
Как использовать JavaScript и получить параметры строки URL адреса
JavaScript позволяет получить параметры строки URL адреса в форме объекта (изображение создано с помощью ИИ)

Как обработать одинаковые параметры строки URL адреса

Мы получили работающий код, но можем столкнуться с проблемой. Дело в том, что в URL адресе могут присутствовать два ключа с одинаковым именем. В нынешнем своём виде getParams() будет включать только последний ключ. Ввиду того, что каждый последующий ключ с одинаковым именем будет затираться новым, потребуется внести в код некоторые поправки.

Давайте напишем проверку и определим, существует ли уже такой ключ в объекте. Если да, то превратим его в массив, добавим существующее значение и запушим в объект.

function getParams (url = window.location) {
    let params = {};
    
    new URL(url).searchParams.forEach(function (val, key) {
        if (params[key] !== undefined) { // Проверяем параметр на undefined
        /* Проверяем, существует ли в объекте идентичный ключ
        *  Если существует, то превращаем его в массив, добавляем текущее значение
        *  и пушим новое
        */
        params[key] = [params[key]]; 
        params[key].push(val);
        } else {
            params[key] = val;
        }
    });
    return params;
}

Однако этот способ отлично работает только при наличии двух одинаковых ключей. Если же их окажется больше, то значение этого ключа уже будет массивом и создание нового вызовет проблемы.

Что касается этой проблемы, то для этого необходимо сначала сделать проверку, является ли params[key] уже массивом. Для этого воспользуемся методом Array.isArray().

Читайте также: Как получить соответствующие условию прямые потомки через CSS и JS.

Финальный код

function getParams (url = window.location) {
    let params = {};
    
    new URL(url).searchParams.forEach(function (val, key) {
        if (params[key] !== undefined) { // Проверяем параметр на undefined
        /* Проверяем, имеется ли в объекте аналогичный params[key] 
        *  Если его нет, то добавляем его в объект
        */
        if (!Array.isArray(params[key])) {
            params[key] = [params[key]];
        }
        params[key].push(val);
        } else {
            params[key] = val;
        }
    });
    console.log(params);
    return params;
}

// Запускаем функцию и передаем в нее URL
getParams(url);

// Получаем в консоль
/* 
    {sandwich: "beef salad", bread: "wheat", seasoning: Array(2)}
    bread: "wheat"
    sandwich: "beef salad"
    seasoning: Array(2)
    0: "ketchup"
    1: "mayonnaise"
    length: 2
    __proto__: Array(0)
    __proto__: Object

*/

В результате, у нас есть работающий код, который позволяет получить параметры строки URL в формате объекта. Он защищён от проблем в случае наличия нескольких параметров с одинаковым именем.