Cómo eliminar un par de valores clave clave en una cadena de consulta sin volver a cargar usando JavaScript

Hay algunos pasos necesarios para hacer esto. Primero necesita convertir la cadena de consulta en un objeto. Una búsqueda rápida en Google me llevó a esta respuesta sobre el desbordamiento de la pila:

consulta window.location.search como JSON

función searchToObject () {
var pares = window.location.search.substring (1) .split (“&”),
obj = {},
par,
yo;

para (i en pares) {
if (pares [i] === “”) continuar;

par = pares [i] .split (“=”);
obj [decodeURIComponent (par [0])] = decodeURIComponent (par [1]);
}

volver obj;
}

función serializar (obj) {
var str = [];
para (var p en obj)
if (obj.hasOwnProperty (p)) {
str.push (encodeURIComponent (p) + “=” + encodeURIComponent (obj [p]));
}
return str.join (“&”);
}

Entonces, llame para obtener los parámetros, luego elimine el parámetro que desea eliminar, cree la nueva URL con una función de serialización y empújela en la pila del historial. De esa manera, cambia la URL sin volver a cargar la página.

var params = searchToObject ();
eliminar params.a
var ruta = window.location.pathname +? + serializar (params);
history.pushState ({}, document.title, ruta);

Para una línea rápida y sucia, puedes probar esto:

const remove_query = name => location.href = location.href.split (‘?’) .map ((url, i) =>! i? url: url.split (‘&’) .filter (p =>! p.startsWith (name + ‘=’)) .join (‘&’)) .join (‘?’);

o, alternativamente, algo como esto:

const remove_query = name => location.href = location.href.split (‘?’) .map ((url, i) =>! i? url: url.replace (new RegExp (`& $ {name} = [ ^ &] * | $ {name} = [^ &] * & `), ”)) .join (‘?’);

Puede dividirse en varias líneas. No se lee muy bien en el formato estrecho de Quora. Solo úsalo como una idea. Como se muestra en otra respuesta, también puede usar window.location.search como fuente, pero tendría que modificar un poco el código. Son bastante sencillos pero un poco tontos ya que quería mantenerlos a cada uno en una sola línea. Oye, si tengo que escribir código por diversión y sin fines de lucro, puedo jugar. 🙂 No me gusta que mi código sea más largo de lo necesario, pero estas líneas son un poco densas.

Está bien, me derrumbé. Aquí hay versiones más largas de cada uno:

función más larga (nombre)
{
const [cabeza, cola] = location.href.split (‘?’);

location.href = head + ‘?’ + tail.split (‘&’) .filter (p =>! p.startsWith (name + ‘=’)) .join (‘&’);
}

y el otro

función más larga (nombre)
{
const [cabeza, cola] = location.href.split (‘?’);

location.href = head + ‘?’ + tail.replace (nuevo RegExp (`& $ {name} = [^ &] * | $ {name} = [^ &] * &`), ”);
}

Hay dos porque no puedo decidir cuál me gusta más y no me molesto en cronometrarlos, así que … tú eliges.

Disfrutar.