我正在构建一个带有查询字符串解析qs.stringify
的URL,其中我只希望URL中存在非空或非null值。
我得到的结果如下:
localhost:3000/user?name=john&age=
但是,我不希望age
参数包含在url中,因为age的值是null
。
以下是我的代码摘录:
const url = `/user?${qs.stringify({ name, age })}`;
有人能帮忙吗?
您可以使用Object.fromEntries
和Object.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.stringify
的filter
选项中的无效值:
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'