I'm constructing a URL with query string parsing qs.stringify
in which I want only non-empty or non-null values to be present in the URL.
The result I am getting is below:
localhost:3000/user?name=john&age=
But, I don't want the age
param to be included in the url as the value for age is null
.
Below is an excerpt from my code:
const url = `/user?${qs.stringify({ name, age })}`;
Could anyone please help?
I'm constructing a URL with query string parsing qs.stringify
in which I want only non-empty or non-null values to be present in the URL.
The result I am getting is below:
localhost:3000/user?name=john&age=
But, I don't want the age
param to be included in the url as the value for age is null
.
Below is an excerpt from my code:
const url = `/user?${qs.stringify({ name, age })}`;
Could anyone please help?
Share Improve this question edited Dec 18, 2020 at 21:36 Aplet123 35.5k1 gold badge39 silver badges64 bronze badges asked Dec 18, 2020 at 21:33 scriobhscriobh 89012 silver badges27 bronze badges7 Answers
Reset to default 5You can make a function using Object.fromEntries
and Object.entries
to filter out non-null and non-empty values:
function filterNonNull(obj) {
return Object.fromEntries(Object.entries(obj).filter(([k, v]) => v));
}
const url = `/user?${qs.stringify(filterNonNull({ name, age }))}`;
qs
package added skipNulls
option since v5.1.0
To pletely skip rendering keys with
null
values, use theskipNulls
flag:
var nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true });
assert.equal(nullsSkipped, 'a=b');
Don't worry, the qs
package supports skip undefined
values as well.
console.log(qs.stringify({a: 1, b: undefined}))
// => "a=1"
runkit
But qs
does NOT support omitting the below zero values: 0
, ''
var qs = require("qs")
console.log(qs.stringify({a:1,b:''})) // "a=1&b="
You can remove nullish values in filter
option of qs.stringify
via fallback to undefined for nullish values:
const values = qs.stringify({a: 1, b: ''}, { filter: (prefix, value) => value || undefined });
assert.equal(values, 'a=1'); // true
you can try this way
const url = `/user?${qs.stringify(Object.entries(obj).forEach( item => ((item[1] === null) || (item[1] === undefined ) ? delete obj[item[0]] : item));)}`;
You also can use reg exp
const url = ``/user?${qs.stringify({ name, age })}``.replace(/[^=&]+=(&|$)/g,"").replace(/&$/,"")
You should allow only those properties which are not null; Easiest way to do that is below
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'