在URL中构造查询参数时,删除qs.stringify中具有空值或null值的键



我正在构建一个带有查询字符串解析qs.stringify的URL,其中我只希望URL中存在非空或非null值。

我得到的结果如下:

localhost:3000/user?name=john&age=

但是,我不希望age参数包含在url中,因为age的值是null

以下是我的代码摘录:

const url = `/user?${qs.stringify({ name, age })}`;

有人能帮忙吗?

您可以使用Object.fromEntriesObject.entries生成一个函数来过滤非空值和非空值:

function filterNonNull(obj) {
return Object.fromEntries(Object.entries(obj).filter(([k, v]) => v));
}
const url = `/user?${qs.stringify(filterNonNull({ name, age }))}`;

qs软件包自v5.1.0 起添加了skipNulls选项

若要完全跳过具有null值的渲染关键帧,请使用skipNulls标志:

var nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true });
assert.equal(nullsSkipped, 'a=b');

别担心,qs包也支持跳过undefined值。

console.log(qs.stringify({a: 1, b: undefined}))
// => "a=1"

runkit

qs不支持省略以下零值:0''

var qs = require("qs")
console.log(qs.stringify({a:1,b:''})) // "a=1&b="

您可以通过回退到未定义的无效值来删除qs.stringifyfilter选项中的无效值:

const values = qs.stringify({a: 1, b: ''}, { filter: (prefix, value) => value || undefined });
assert.equal(values, 'a=1'); // true

您可以尝试这种方式

const url = `/user?${qs.stringify(Object.entries(obj).forEach( item => ((item[1] === null) || (item[1] === undefined ) ? delete obj[item[0]] : item));)}`;

您还可以使用reg expconst url = ``/user?${qs.stringify({ name, age })}``.replace(/[^=&]+=(&|$)/g,"").replace(/&$/,"")

您应该只允许那些不为null的属性;最简单的方法是低于

const name=null,age=23;
const obj = {
name,
age}
let newObj = {
}
for (prop in obj){
if(obj[prop]){
newObj[prop] = obj[prop];
}
}
console.log(newObj);

const params = {
a: 1, 
b: '', 
c: '', 
d: 4, 
e: undefined, 
f: null
}
queryString.stringify(params, {
skipEmptyString: true,
skipNull: true
})
//=> 'a=1&d=4'

最新更新