如何使用lodash从对象中删除空值

时间:2016-07-08 21:38:43

标签: javascript object lodash

我有一个具有多个属性的对象,我想使用lodash删除空的对象/嵌套对象。这样做的最佳方式是什么?

Let template = {
      node: "test",
      representation: {
        range: { }
      },
      transmit: {
        timeMs: 0
      }
    };

template = {
      node: "test",
      transmit: {
        timeMs: 0
      }
    };

我试过这样的事,但我输了。

Utils.removeEmptyObjects = function(obj) {
  return _.transform(obj, function(o, v, k) {
    if (typeof v === 'object') {
      o[k] = _.removeEmptyObjects(v);
    } else if (!_.isEmpty(v)) {
      o[k] = v;
    }
  });
};
_.mixin({
  'removeEmptyObjects': Utils.removeEmptyObjects
});

5 个答案:

答案 0 :(得分:6)

您可以通过以下几个步骤实现这一目标:

  1. 使用pickBy()使用isObject()谓词选择对象键值。

  2. 使用mapValues()递归调用removeEmptyObjects(),请注意它只会使用对象调用此函数。

  3. 使用带有omitBy()谓词的isEmpty()删除mapValues()后找到的所有空对象。

  4. 使用assign()分配对象中的所有原始值以进行分配,并使用omitBy()谓词isObject()分配。{/ p>

  5. function removeEmptyObjects(obj) {
      return _(obj)
        .pickBy(_.isObject) // pick objects only
        .mapValues(removeEmptyObjects) // call only for object values
        .omitBy(_.isEmpty) // remove all empty objects
        .assign(_.omitBy(obj, _.isObject)) // assign back primitive values
        .value();
    }
    

    
    
    function removeEmptyObjects(obj) {
      return _(obj)
        .pickBy(_.isObject)
        .mapValues(removeEmptyObjects)
        .omitBy(_.isEmpty)
        .assign(_.omitBy(obj, _.isObject))
        .value();
    }
    
    _.mixin({
      removeEmptyObjects: removeEmptyObjects
    });
    
    var template = {
      node: "test",
      representation: {
        range: {}
      },
      transmit: {
        timeMs: 0
      }
    };
    
    var result = _.removeEmptyObjects(template);
    
    document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
    &#13;
    <script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>
    &#13;
    &#13;
    &#13;

答案 1 :(得分:3)

更新:

从没有嵌套对象的对象中删除未定义、空和空字符串

target_redshift_config.json

对于嵌套对象,您可以创建一个递归函数来执行此操作

它将删除空对象、空数组、null、未定义、任何级别的空字符串...

_.omitBy(object, (v) => _.isUndefined(v) || _.isNull(v) || v === '');

示例:

removeEmpty(obj) {
        let finalObj = {};
        Object.keys(obj).forEach((key) => {
            if (obj[key] && typeof obj[key] === 'object') {
                const nestedObj = removeEmpty(obj[key]);
                if (Object.keys(nestedObj).length) {
                    finalObj[key] = nestedObj;
                }
            } else if (obj[key] !== '' && obj[key] !== undefined && obj[key] !== null) {
                finalObj[key] = obj[key];
            }
        });
        return finalObj;
    }

答案 2 :(得分:0)

这是我从对象中删除空值的方法

 _.mapKeys(object, function (value, key) {
      if (_.isEmpty(value)) delete object[key];
});

当对象值为空时,将使用键删除对象字段。

答案 3 :(得分:-1)

我正在为那些将来寻找解决此问题的方法的人进行更新。

lodash提供了一种更简单的方法。

_。compact(arrayName)将使用lodash从数组中删除所有空/未定义/空值

答案 4 :(得分:-2)

您可以使用_.pick仅选择所需的属性,例如

var desiredTemplate = _.pick(template, ['node','transmit']); 

否则,据我所知,lodash没有任何内置功能可以递归地从对象中删除空对象/数组。