【问题标题】:How to remove empty values from object using lodash如何使用 lodash 从对象中删除空值
【发布时间】:2016-11-11 13:25:48
【问题描述】:

我有一个具有多个属性的对象,我想使用 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
});

【问题讨论】:

    标签: javascript object lodash


    【解决方案1】:

    您可以通过几个步骤来实现:

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

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

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

    4. 使用assign() 重新分配对象中的所有原始值,并使用omitBy()isObject() 谓词。


    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>');
    &lt;script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"&gt;&lt;/script&gt;

    【讨论】:

    • 它不适用于对象数组。你能为jsfiddle.net/alpeshprajapati/fy3uLpw5修改这个吗?它返回对象的对象,而不是对象数组。
    • 如果它是一个对象数组,那么将lodash#map与这个函数一起使用..例如var result = _.map(array, removeEmptyObjects);
    • 这个我没看懂,能不能修改jsfiddle?
    • 我的 obj 包含嵌套的对象数组,例如[和]键。您可以在控制台中检查“结果”,其中包含规则下的“和”键的对象对象。
    • 这里并不优雅,但应该可以解决您的问题。 jsfiddle.net/ryeballar/n0afoxdu
    【解决方案2】:

    更新:

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

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

    对于嵌套对象,您可以创建一个递归函数

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

    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;
        }
    

    例子:

       const obj = {
                a: '',
                aa: null,
                aaa: undefined,
                aaaa: 'aaaa',
                aaaaa: 0,
                aaaaaa: 1,
                aaaaaaa: 2,
                aaaaaaaa: true,
                aaaaaaaaa: false,
                emptyObj: {},
                emptyArray: [],
                array: [
                    {
                        a: '',
                        aa: null,
                        aaa: undefined,
                        aaaa: 'aaaa',
                        aaaaa: 0,
                        aaaaaa: 1,
                        aaaaaaa: 2,
                        aaaaaaaa: true,
                        aaaaaaaaa: false,
                        emptyObj: {},
                        emptyArray: [],
                        obj: {
                            a: '',
                            aa: null,
                            aaa: undefined,
                            aaaa: 'aaaa',
                            aaaaa: 0,
                            aaaaaa: 1,
                            aaaaaaa: 2,
                            aaaaaaaa: true,
                            aaaaaaaaa: false,
                            emptyObj: {},
                            emptyArray: [],
                        },
                    },
                    {
                        a: '',
                        aa: null,
                        aaa: undefined,
                        aaaa: 'aaaa',
                        aaaaa: 0,
                        aaaaaa: 1,
                        aaaaaaa: 2,
                        aaaaaaaa: true,
                        aaaaaaaaa: false,
                        emptyObj: {},
                        emptyArray: [],
                        obj: {
                            a: '',
                            aa: null,
                            aaa: undefined,
                            aaaa: 'aaaa',
                            aaaaa: 0,
                            aaaaaa: 1,
                            aaaaaaa: 2,
                            aaaaaaaa: true,
                            aaaaaaaaa: false,
                            emptyObj: {},
                            emptyArray: [],
                        },
                    },
                ],
                b: {
                    a: '',
                    aa: null,
                    aaa: undefined,
                    aaaa: 'aaaa',
                    aaaaa: 0,
                    aaaaaa: 1,
                    aaaaaaa: 2,
                    aaaaaaaa: true,
                    aaaaaaaaa: false,
                    emptyObj: {},
                    emptyArray: [],
                    c: {
                        a: '',
                        aa: null,
                        aaa: undefined,
                        aaaa: 'aaaa',
                        aaaaa: 0,
                        aaaaaa: 1,
                        aaaaaaa: 2,
                        aaaaaaaa: true,
                        aaaaaaaaa: false,
                        emptyObj: {},
                        emptyArray: [],
                    },
                },
            };
    
            const finalObj = removeEmpty(obj);
            console.log('finalObj After remove', finalObj);
    

    【讨论】:

    • 这不处理嵌套对象
    • 我已经更新了嵌套对象的答案,但没有使用 lodash
    • @Gouda 请让我知道这是否适合你。
    【解决方案3】:

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

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

    当对象值为空时,它会删除带有键的对象字段。

    【讨论】:

      【解决方案4】:

      我正在为那些在未来寻求解决此问题的人更新此内容。

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

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

      【讨论】:

        【解决方案5】:

        您可以使用_.pick 仅选择您想要的属性,如

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-12-02
          • 2014-07-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-03
          相关资源
          最近更新 更多