Reputation: 25
I'm looking to loop through an object and delete values that are deemed to be "falsey", ie: false, null, 0, Nan, etc.
So far, my code looks like this:
function truthyObjLoop(user) {
var falseAnswer = undefined;
for (var key in user) {
if (user[key] === false) {
falseAnswer += user[key];
delete falseAnswer;
}
}
return user;
}
I know it's bugged, but I'm having a difficult time locating and fixing the issue. I'm very new to Javascript and any help is appreciated.
Thanks.
Upvotes: 2
Views: 1494
Reputation: 469
If you only want to catch values which are equivilant to false, null, undefined, or 0... you should use @travis j's answer. however if you want to also match NaN values, i'd suggest a minor adjustment
function truthyObjLoop(user){
for(var key in user){
if(user.hasOwnProperty(key) && (!user[key] || isNaN(user[key]) )) delete user[key];
}
return user;
}
if you can extend it even further to include empty arrays and empty objects
function truthyObjLoop(user){
for(var key in user){
if( user.hasOwnProperty(key) && (!user[key] ||
Number.isNaN(user[key]) ||
(user[key] instanceof Array && !user[key].length) ||
(user[key] instanceof Array ==false && user[key] instanceof String == false && !Number.isInteger(user[key]) && !Object.keys(user[key]).length) ))
delete user[key];
}
return user;
}
}
Upvotes: 0
Reputation: 82297
You were rather close in your first attempt. However, comparing === false
will not always catch "falsey" values. Simply using !value
on and checking for true will look for falsey values because it implicitly casts the value to boolean. At that point all that is left is to iterate and remove.
function truthyObjLoop(user){
for(var key in user){
if(user.hasOwnProperty(key) && !user[key]) delete user[key];
}
return user;
}
Upvotes: 2