Recursively remove null values from JavaScript object

前端 未结 8 847
挽巷
挽巷 2020-12-28 16:07

I have a JSON obj, after some operations (like delete some pieces), I print it and everything looks good except that I have some null values. How do I remove th

8条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-28 16:23

    I had to solve a similar problem, however I wanted to remove not only null values but also undefined, NaN, empty String, empty array and empty object values, recursively, by inspecting nested objects and also nested arrays.

    The following function is using Lo-Dash:

    function pruneEmpty(obj) {
      return function prune(current) {
        _.forOwn(current, function (value, key) {
          if (_.isUndefined(value) || _.isNull(value) || _.isNaN(value) ||
            (_.isString(value) && _.isEmpty(value)) ||
            (_.isObject(value) && _.isEmpty(prune(value)))) {
    
            delete current[key];
          }
        });
        // remove any leftover undefined values from the delete 
        // operation on an array
        if (_.isArray(current)) _.pull(current, undefined);
    
        return current;
    
      }(_.cloneDeep(obj));  // Do not modify the original object, create a clone instead
    }
    

    For example, if you invoke the method with the following input object:

    var dirty = {
      key1: 'AAA',
      key2: {
        key21: 'BBB'
      },
      key3: {
        key31: true,
        key32: false
      },
      key4: {
        key41: undefined,
        key42: null,
        key43: [],
        key44: {},
        key45: {
          key451: NaN,
          key452: {
            key4521: {}
          },
          key453: [ {foo: {}, bar:''}, NaN, null, undefined ]
        },
        key46: ''
      },
      key5: {
        key51: 1,
        key52: '  ',
        key53: [1, '2', {}, []],
        key54: [{ foo: { bar: true, baz: null }}, { foo: { bar: '', baz: 0 }}]
      },
      key6: function () {}
    };
    

    It'll recursively discard all the "bad" values, keeping in the end only the ones that carry some information.

    var clean = pruneEmpty(dirty);
    console.log(JSON.stringify(clean, null, 2));
    
    {
      key1: 'AAA',
      key2: {
        key21: 'BBB'
      },
      key3: {
        key31: true,
        key32: false
      },
      key5: {
        key51: 1,
        key52: '  ',
        key53: [1, '2'],
        key54: [{ foo: { bar: true }}, { foo: { baz: 0 }}]
      }
    };
    

    Hope it helps!

提交回复
热议问题