Estoy utilizando la API URLSearchParams para eliminar claves/valores de la cadena de consulta en mi URL.
Tengo el siguiente fragmento:
params = new URLSearchParams('a=x&b=y&c=z'); params.forEach(function(value, key){ console.log("Deleted: ", key, value, params.toString()); params.delete(key); }); console.log("Left with: ", params.toString()); Invariablemente, Left with: devuelve parte de los parámetros de consulta.
Salida en este JSFiddle:
☁️ "Running fiddle" "Deleted: ", "a", "x", "a=x&b=y&c=z" "Deleted: ", "c", "z", "b=y&c=z" "Left with", "b=y"Mi entendimiento de forEach() es que recorrerá todos los pares clave/valor, pero según este violín, parece que sale del ciclo en el penúltimo par.
Editar, según los comentarios en los comentarios a continuación:
Estoy tratando de retener selectivamente uno o dos parámetros (basado en una lista proporcionada).
params = new URLSearchParams('a=x&b=y&c=z&d=1'); params.forEach(function(value, key){ retainList = ['d']; if (retainList.includes(key)){ console.log("Retaining ", key); } else { console.log("Deleted: ", key, value, params.toString()); params.delete(key); } }); console.log("Left with: ", params.toString());Parece que hay un problema de referencia extraño con URLSearchParams. Incluso cuando usa el método .keys() para obtener una lista de claves, parece que está dando una referencia a su lista interna de claves.
Puede solucionar este problema clonando la lista de claves usando spread
params = new URLSearchParams('a=x&b=y&c=z'); keys = [...params.keys()] for (key of keys) { console.log("Deleting: ", key, params.get(key), params.toString()); params.delete(key) }; console.log("Left with: ", params.toString());Para lograr el resultado deseado podrías hacer:
params = new URLSearchParams('a=x&b=y&c=z&d=1'); retainList = ['d'] for (key of [...params.keys()]) { if (! retainList.includes(key)) { console.log("Deleting: ", key, params.get(key), params.toString()); params.delete(key) } }; console.log("Left with: ", params.toString());