I have this JSON
object myFilters :
{"filters":
{"role":"","jobs":[]}
}
I can correctly remove the empty object from it with this function clean ( myFilters
):
function clean(obj) {
for (var propName in obj) {
if (
obj[propName] === null ||
obj[propName] === undefined ||
obj[propName] === ""
) {
delete obj[propName];
}
}
So now, my myFilters object becomes:
{"filters":
{ "jobs":[] }
}
How can I now remove the empty array and the key from my JSON
object?
You should add one more condition like
function clean(obj) {
for (var propName in obj) {
if (
obj[propName] === null ||
obj[propName] === undefined ||
obj[propName] === "" ||
Array.isArray(obj[propName]) && obj[propName].length === 0
) {
delete obj[propName];
}
}
}
You should check the type of property before check its value by the typeof
The jobs property is an object and you can check its value by its length . it is empty if its length equals to 0.
function clean(obj) {
for (var propName in obj) {
if (typeof (obj[propName]) == 'object') {
if (obj[propName].length == 0) {
delete obj[propName];
}
} else {
if (
obj[propName] === null ||
obj[propName] === undefined ||
obj[propName] === ""
) {
delete obj[propName];
}
}
}
}
I like Saveli Tomac's solution , so I upvoted that. Let me show you an additional shortening on the original solution also.
As it's been stated that you need to check 2 more things if you are looking for an empty array. So what about checking null
, undefined
and ''
values easier?
if (!undefined) { console.log('undefined needs to be deleted') }; if (!null) { console.log('null needs to be deleted') }; if (!'') { console.log(`'' needs to be deleted`) };
Checking Array.length
if it has 0
value can be also shorter just like the following:
const array1 = []; const array2 = [1,2,3]; if (!array1.length) { console.log('array1 has 0 length') }; if (!array2.length) { console.log('array2 has 0 length') };
So based on those code snippets you can have an additional shortening just like the following:
// extended with other types for the demo let myObject = { "filters": { "role": "", "jobs": [], "nullValue": null, "undefinedIsHere": undefined, "arrayWithValue": [1,2,3], "stringValue": "hello", "numberishere": 123 } }; const clean = (obj) => { for (let propName in obj) { if ( !obj[propName] || Array.isArray(obj[propName]) && !obj[propName].length ) { delete obj[propName] }; } } clean(myObject.filters); console.log(myObject);
Or with a 1️⃣ liner:
// extended with other types for the demo let myObject = { "filters": { "role": "", "jobs": [], "nullValue": null, "undefinedIsHere": undefined, "arrayWithValue": [1,2,3], "stringValue": "hello", "numberishere": 123 } }; const clean = (obj) => { Object.keys(obj).forEach(propName => (!obj[propName] || Array.isArray(obj[propName]) && !obj[propName].length) && delete obj[propName]); } clean(myObject.filters); console.log(myObject);
Read further here:
I hope this helps!
Try this :
var filterObj = { "filters": { "role": "", "jobs": [] } }; for (var i in filterObj) { for (var j in filterObj[i]) { if ((filterObj[i][j] === null) || (filterObj[i][j] === undefined) || (filterObj[i][j].length === 0)) { delete filterObj[i][j]; } } } console.log(filterObj);
It should be like this:
function clean(obj) {
for (var propName in obj) {
if (obj.hasOwnProperty(propName) &&
obj[propName] === null ||
obj[propName] === undefined ||
obj[propName] === "" ||
(Array.isArray(obj[propName]) && obj[propName].length <= 0)
) {
delete obj[propName];
}
}
}
Saveli 's answer should work fine. Here's an alternative approach you can use to achieve the same result.
const object = { "filters": { "role": "", "jobs": [], "foo": undefined, "baz": null, "bar": {}, "moreJobs": ['1', '2'] } } const result = { filters: Object.keys(object.filters).reduce((acc, key) => { if ( object.filters[key] !== null && object.filters[key] !== undefined && object.filters[key] !== '' && typeof object.filters[key] === 'object' && Object.keys(object.filters[key]).length > 0 ) { acc[key] = object.filters[key]; } return acc; }, {}) }; console.log(result);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.