Ревью кода, сократить код

Этот кусок кода выглядит страшно

let url = `${API_URL}api/tasks?startDate=${startDate}&endDate=${endDate}`
        
        if(!arrayIsEmpty(priorities)) {
            url = `${API_URL}api/tasks?startDate=${startDate}&endDate=${endDate}&priorities=${JSON.stringify(priorities)}`
        }
        if(!arrayIsEmpty(statuses)) {
            url = `${API_URL}api/tasks?startDate=${startDate}&endDate=${endDate}&statuses=${JSON.stringify(statuses)}`
        }
        if(!arrayIsEmpty(priorities) && !arrayIsEmpty(statuses)) {
            url = `${API_URL}api/tasks?startDate=${startDate}&endDate=${endDate}&priorities=${JSON.stringify(priorities)}&statuses=${JSON.stringify(statuses)}`
        }

Можно ли как то сократить данный фрагмент?


Ответы (1 шт):

Автор решения: Вадим Александру

Думаю плодить по одному ifу каждый раз когда добавляется новый GET параметр, - плохая идея. Есть смысл собрать их в один объект

const searchParameters = {
    startDate: startDate,
    endDate: endDate,
    priorities: priorities,
    statuses: statuses
}

Чтобы вручную не билдить url можно использовать стандартный класс URL, далее циклом проходимся по всем свойствам объекта searchParameters, делаем необходимые проверки на пустоту на тип итд и добавляем их в параметры объекта URL

url = new URL(`${API_URL}api/tasks`);

for (const [key, value] of Object.entries(searchParameters)) {
    if(Array.isArray(value) || Object.is(value)) {
        if(! arrayIsEmpty(value)) {
            url.searchParams.append(key, JSON.stringify(value))
        }
    } else if(value !== undefined && value !== null) {
        url.searchParams.append(key, value)
    }

}

таким образом при добавлении еще одного параметра поиска не нужно менять логику билда, достаточно добавить еще одно свойство в searchParameters

Вот собственно весь код (Написан чисто для наглядности алгоритма, прошу жеесников не бить :D)

const searchParameters = {
    startDate: startDate,
    endDate: endDate,
    priorities: priorities,
    statuses: statuses
},
    url = new URL(`${API_URL}api/tasks`);


for (const [key, value] of Object.entries(searchParameters)) {
    if(Array.isArray(value) || Object.is(value)) {
        if(! arrayIsEmpty(value)) {
            url.searchParams.append(key, JSON.stringify(value))
        }
    } else if(value !== undefined && value !== null) {
        url.searchParams.append(key, value)
    }

}

console.log(url.href)
→ Ссылка