Estoy tratando de manipular mi URL usando URLSearchParams . Sin embargo URLSearchParams.delete() espera el nombre del parámetro. Si tengo parámetros con el mismo nombre (por lo que he probado en Chrome), eliminará todos los parámetros con ese nombre. ¿Hay alguna manera de eliminar por nombre y valor?
Mi consulta se parece a esto:
?color[]=Black&color[]=Green&material[]=Steel
Entonces, cuando llamo a .delete("color[]") , eliminará ambos color[]= params, pero ¿qué pasa si solo quiero eliminar uno específico?
El motivo de los nombres duplicados es que el backend (PHP) está aprovechando esta funcionalidad para analizar automáticamente los parámetros en matrices... lo que requiere la sintaxis anterior.
El panorama general es: estoy tratando de agregar/eliminar "filtros" de esta futura matriz. Además, algunas categorías de filtro podrían tener valores coincidentes, por lo que tampoco quiero eliminarlos por valor. Estoy abierto a considerar un enfoque completamente nuevo... simplemente tratando de hacerlo de la manera menos extraña.
Para cualquier usuario de Laravel, recomiendo no usar la sintaxis sin índice. Simplemente use color[0]= , color[1]= etc. No me di cuenta de que laravel admite ambas sintaxis.
Para eliminar un par clave/valor específico, recorra las entradas, filtre las no deseadas y cree un nuevo URLSearchParams :
function deleteParamsEntry(params, key, value) { const newEntries = Array.from(params.entries()).filter( ([k, v]) => !(k === key && v === value) ); return new URLSearchParams(newEntries); } const query = "?color[]=Black&color[]=Green&material[]=Steel"; const params = new URLSearchParams(query); const newParams = deleteParamsEntry(params, "color[]", "Green"); console.log(newParams.toString());Pruebe este enfoque:
const deleteURLParamsByNameAndValue = (urlString, paramName, paramValue) => { const url = new URL(urlString) const params = url.searchParams const newParamArray = [] for (var kvPair of params.entries()) { const k = kvPair[0] const v = kvPair[1] if (k!==paramName || v!==paramValue) { newParamArray.push(kvPair) } } const newSearch = new URLSearchParams(newParamArray) return decodeURI(`${url.origin}${url.pathname}?${newSearch}`) } const urlString = 'https://example.com/path1/path2?color[]=Black&color[]=Green&material[]=Steel' deleteURLParamsByNameAndValue(urlString,'color[]','Black') // returns 'https://example.com/path1/path2?color[]=Green&material[]=Steel'