【问题标题】:How to deep remove falsey values and empty objects from an object using lodash如何使用 lodash 从对象中深度删除虚假值和空对象
【发布时间】:2020-10-20 13:08:42
【问题描述】:

如何使用 lodash 深度删除所有虚假值和空对象?

f.e.我想要我的对象:

{ a:undefined, b:2, c:4, d:undefined , e:{ f:{} , g:null } }

变成:

{ b:2, c:4 };

【问题讨论】:

  • e:{ f:'somevalue , g:null } 会发生什么
  • e:{f:somevalue}
  • 那么它会递归遍历所有对象吗? {} 也不是假的。
  • for .. of 循环在这里不起作用吗?然后使用 if 和 delete false 属性?
  • 请添加您的尝试。你想获得一个新对象还是只删除不需要的属性?你也有数组吗?

标签: javascript json lodash


【解决方案1】:

var test = {
  a: undefined,
  b: 2,
  c: 4,
  d: undefined,
  e: {
    f: {},
    g: null
  }
};

function clean(obj) {
  for (var propName in obj) {
    if (_.isObject(obj[propName])) {
      clean(obj[propName]);
    }
    if (obj[propName] === null || obj[propName] === undefined || _.isObject(obj[propName]) && _.isEmpty(obj[propName])) {
      delete obj[propName];
    }
  }
}

clean(test);
console.log(test);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js"></script>

【讨论】:

    【解决方案2】:

    您可以获得要删除的属性并获得一个干净的对象。这种方法会变异为原始对象。

    function clean(value) {
        if (value === null || value === undefined) return true;
        if (typeof value !== 'object') return false;
        if (Array.isArray(value)) {
            let i = value.length;
            while (i--) if (clean(value[i])) value.splice(i, 1);
            return !value.length;
        }
        Object
            .keys(value)
            .filter(k => clean(value[k]))
            .forEach(Reflect.deleteProperty.bind(null, value));
    
        return !Object.keys(value).length;
    }
    
    const 
        object = { a: undefined, b: 2, c: 4, d: undefined, e: { f: {}, g: null } , h: [], i: [1, []], j: [[[], []]] };
    
    clean(object);
    
    console.log(object);

    【讨论】:

    • 不用问为什么……为什么?
    【解决方案3】:

    这个问题非常模糊,并没有说明原始结构是否可能发生突变。里面也没有关于数组的内容。

    此答案假设您不想改变原始数据结构,并且“深度”也意味着遍历所有数组元素。如果对象或数组导致空实例,则将删除相应的键。

    function deepCompact(collection) {
      const add = _.isArray(collection)
                ? (collection, key, value) => collection.push(value)
                : (collection, key, value) => collection[key] = value;
      
      return _.transform(collection, (collection, value, key) => {
        if (_.isObject(value)) {
          value = deepCompact(value);
          if (_.isEmpty(value)) return;
        } else {
          if (!value) return;
        }
        add(collection, key, value);
      });
    }
    
    const data1 = {a: undefined, b: 2, c: 4, d: undefined, e: {f: {} , g: null}};
    console.log(deepCompact(data1));
    const data2 = [{a: 0, b: 2}, false, {c: [{d: null}]}, {e: [{f: 1}]}];
    console.log(deepCompact(data2));
    <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.20/lodash.min.js"></script>

    transformreduce 相当,但是第一个回调参数被锁定到提供的或默认的累加器。这意味着您不必从回调中返回累加器。 transform 的默认累加器也不同于 reducereduce 使用第一个元素作为初始值,而transform 使用与提供的集合具有相同原型的新对象作为默认值。

    【讨论】:

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