Is there a nice way in javascript to removing Falsy values from a javascript object (not an array)?

倾然丶 夕夏残阳落幕 提交于 2021-02-04 20:47:12

问题


In JavaScript you have the nice .filter method to remove null or falsy values from arrays. So far I haven't been able to find a method to remove the same from JavaScript Objects.

Why would this be?

Currently you can create a function for arrays like :

function stripNulls(arr) {
   return arr.filter(Boolean);
}

Is there a similar function that can be created for JS Objects, or is the way filter works not practical on JS Objects.


回答1:


The answer to "can I do x to an object" (or an array for that matter) is usually "yes" and it frequently involves some form of reduce.

If you want to filter falsy values you could do something like this:

function filterFalsy(obj) {
  return Object.keys(obj).reduce((acc, key) => {
    if (obj[key]) {
      acc[key] = obj[key]
    }

    return acc
  }, {})
}

const testObj = {
  a: 'test',
  b: 321,
  c: false
}

console.log(filterFalsy(testObj))

This returns a new object without falsy values and leaves the existing object alone.




回答2:


WARNING: There are better answers provided here. Also, thanks to comments made below user's should be warned using delete may provide suboptimal performance.

Filtering invalid values is a little more complex in objects. At face value this will do what you want:

var arr = [ 'apple', 43, false ];
var trueArr = arr.filter(Boolean);

console.log(trueArr);

var obj = { 'title': 'apple', 'id': 43, 'isOrange': false, 'test': 'asd' };
Object.keys(obj)
  .filter(key => !obj[key])
  .forEach(key => delete obj[key]);

console.log(obj);

However, this will not iterate over child objects / functions. This logic also directly modifies the original object (which may or may not be desired).

That can easily changed by adding this logic to a function like so:

function removeFalseyProperties(obj) {
  Object.keys(obj)
    .filter(key => !obj[key])
    .forEach(key => delete obj[key]);
    
  return obj;
}

var testObj = { 'title': 'apple', 'id': 43, 'isOrange': false, 'test': 'asd' };
var trutheyObj = removeFalseyProperties(testObj);

console.log(trutheyObj);



回答3:


falsy values are 0, undefined, null, false, etc.

myArray
    .map(item => {
        // ...
    })
    // Get rid of bad values
    .filter(Boolean);

By passing Boolean we can remove all the falsy values.



来源:https://stackoverflow.com/questions/48655157/is-there-a-nice-way-in-javascript-to-removing-falsy-values-from-a-javascript-obj

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!