【问题标题】:Remove a URL search parameter when there is duplicate names?删除URL搜索参数时,有重复的名字?
【发布时间】:2022-01-10 06:22:26
【问题描述】:

我正在尝试使用URLSearchParams 操纵我的网址。但是 URLSearchParams.delete() 需要参数的名称。如果我有同名的参数,(从我在 chrome 中测试的内容)它将删除所有具有该名称的参数。有没有办法同时按名称和值删除?

我的查询如下所示:

?color[]=Black&color[]=Green&material[]=Steel

所以当我调用.delete("color[]") 时,它会删除两个color[]= 参数,但是如果我只想删除一个特定的参数怎么办?

重复名称的原因是后端 (PHP) 正在利用 this functionallity 将参数自动解析为数组...这需要上述语法。

大图是-我正在尝试从这个待定数组中添加/删除“过滤器”。此外,某些过滤器类别可能具有匹配的值,因此我也不希望按值删除。我愿意考虑一种全新的方法……只是尝试以最不老套的方式来做。

-- 编辑--

对于任何 Laravel 用户,我建议不要使用无索引语法。只需使用color[0]=color[1]= 等。我没有意识到 laravel 支持这两种语法。

【问题讨论】:

  • delete() 期望参数的名称”是什么意思? delete() 函数从何而来?
  • 寻求代码帮助的问题必须包括在问题本身中重现它所需的最短代码,最好是在Stack Snippet 中。请参阅如何创建 Minimal, Reproducible Example。在您的问题中显示预期结果并引用您遇到的任何(确切)错误也非常有帮助。您应该展示自己为解决这个问题所做的任何研究。
  • @code 是 URLSearchParams 接口的方法
  • 有没有办法同时按名称和值删除 我也不想按值删除,比较混乱
  • 在 Firefox 上运行的测试 jsfiddle.net/9h82gjwx 显示,delete() 删除了名称的所有参数(就像 documented 一样)。您能否提供代码(和环境,例如浏览器)来证明您的问题。

标签: javascript php url


【解决方案1】:

要删除特定的键/值对,遍历条目,过滤掉不需要的,然后创建一个新的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());

【讨论】:

    【解决方案2】:

    试试这个方法:

    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'
    

    【讨论】:

      猜你喜欢
      • 2017-11-14
      • 2013-12-14
      • 2018-05-12
      • 2014-10-06
      • 2013-06-01
      • 1970-01-01
      • 2015-12-28
      • 2016-11-11
      • 2012-01-20
      相关资源
      最近更新 更多