How to remove undefined and null values from an object using lodash?

前端 未结 23 2351
既然无缘
既然无缘 2020-11-29 18:06

I have a Javascript object like:

var my_object = { a:undefined, b:2, c:4, d:undefined };

How to remove all the undefined properties? False

23条回答
  •  囚心锁ツ
    2020-11-29 18:09

    with pure JavaScript: (although Object.entries is ES7, Object.assign is ES6; but equivalent ES5 uses Object.keys only should be also doable); also notice v != null checks for both null and undefined;

    > var d = { a:undefined, b:2, c:0, d:undefined, e: null, f: 0.3, s: "", t: false };
    undefined
    > Object.entries(d)
        .filter(([ k, v ]) => (v != null))
        .reduce((acc, [k, v]) => Object.assign(acc, {[k]: v}), {})
    { b: 2, c: 0, f: 0.3, s: '', t: false }
    

    Edit: this below is the version with ES5 Object.keys only: but generally with ES7 in Node v8 is pretty much enjoyable ;-)

    > Object.keys(d)
        .filter(function(k) { return d[k] != null; })
        .reduce(function(acc, k) { acc[k] = d[k]; return acc; }, {});
    { b: 2, c: 0, f: 0.3, s: '', t: false }
    

    Update in October 2017: with Node v8 (since v8.3 or so) now it has object spreading construct:

    > var d = { a:undefined, b:2, c:0, d:undefined,
        e: null, f: -0.0, s: "", t: false, inf: +Infinity, nan: NaN };
    undefined
    > Object.entries(d)
        .filter(([ k, v ]) => (v != null))
        .reduce((acc, [k, v]) => ({...acc, [k]: v}), {})
    { b: 2, c: 0, f: -0, s: '', t: false, inf: Infinity, nan: NaN }
    

    or within one reduce only:

    > Object.entries(d)
       .reduce((acc, [k, v]) => (v==null ? acc : {...acc, [k]: v}), {})
    { b: 2, c: 0, f: -0, s: '', t: false, inf: Infinity, nan: NaN }
    

    Update: someone want recursive? isn't that hard either, just need an additional check of isObject, and recursively call itself:

    > function isObject(o) {
        return Object.prototype.toString.call(o) === "[object Object]"; }
    undefined
    > function dropNullUndefined(d) {
        return Object.entries(d)
          .reduce((acc, [k, v]) => (
            v == null ? acc :
             {...acc, [k]: (isObject(v) ? dropNullUndefined(v) : v) }
          ), {});
      }
    > dropNullUndefined({a: 3, b:null})
    { a: 3 }
    > dropNullUndefined({a: 3, b:null, c: { d: 0, e: undefined }})
    { a: 3, c: { d: 0 } }
    

    my conclusion: if pure Javascript can do, I would avoid any third party library dependencies:

提交回复
热议问题