Jimmy Carrigan
Jimmy Carrigan

Reputation: 25

Loop Through an Object's Values and Delete Falsey Values

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

Answers (2)

Ja Superior
Ja Superior

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

Travis J
Travis J

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

Related Questions