如何使用 URLSearchParams 删除空查询参数?

aeX*_*264 11 javascript url url-parameters node.js

我正在使用查询参数,并被介绍到URLSearchParams. 我用它来形成这种要查询的对象,

const x = {
  a: 'hello World'
  b: 23
  c: ''
}
let params = new URLSearchParams(x);
console.log(params.toString()) // a=hello+World&b=23&c=
Run Code Online (Sandbox Code Playgroud)

在这里,我不想拥有那个c=,因为它很丑,而且我的 API 不需要那个。

所以,我想要这个结果a=hello+World&b=23(没有空的查询字符串)但是,我在 mdn 文档上找不到任何东西。

我该怎么做?

这样做不起作用,因为它似乎直接改变了params影响forEach

const x = {
  a: 'hello World',
  b: '',
  c: ''
};

let params = new URLSearchParams(x);
params.forEach((v, k) => { // never reaches `c`
  console.log(k, ' => ', v)
  if (v == '')
    params.delete(k);
});
console.log(params.toString());
Run Code Online (Sandbox Code Playgroud)

Rah*_*obe 7

您可以遍历键值对并删除具有空值的键:

const x = {
  a: 'hello World',
  b: '',
  c: ''
};

let params = new URLSearchParams(x);
let keysForDel = [];
params.forEach((v, k) => {
  if (v == '')
    keysForDel.push(k);
});
keysForDel.forEach(k => {
  params.delete(k);
});
console.log(params.toString());
Run Code Online (Sandbox Code Playgroud)

  • 我不敢相信这不是 URLSearchParams API 的一部分。我不敢相信这是规范的解决方案。我就是不能。 (4认同)
  • 请注意,这也会删除“0”值 (2认同)

小智 7

我自己做的一个干净的方法如下(使用lodash):

import omitBy from 'lodash/omitBy';
import isEmpty from 'lodash/isEmpty';

const x = {
  a: 'hello World'
  b: 23
  c: ''
}

const params = new URLSearchParams(omitBy(x, isEmpty));

// mixing other sets
const params = new URLSearchParams({
  otherParam: 'foo', 
  ...omitBy(x, isEmpty)
});
Run Code Online (Sandbox Code Playgroud)

  • 这也会删除 0 值。 (2认同)