忽略没有填充属性的对象

时间:2020-11-03 20:12:58

标签: javascript lodash

考虑这样的javascript对象:

const fooObject = {
   firstName: 'John',
   lastName: null,
   age: 43,
   address: {
      city: null,
      country: null
   }
}

我通常使用函数omitBy来删除未设置的字段omitBy(fooObject, isNil),但不适用于上述fooObject这样的对象。有一些不错的方法如何用lodash或vanilla js删除给定对象上的嵌套空对象和字段?

我对fooObject对象的预期结果是:

{
   firstName: 'John',
   age: 43
}

如果该地址将至少包含一个填充的城市,则结果应为:

{
   firstName: 'John',
   age: 43,
   address: {
      city: 'Los Angeles',
   }
}

2 个答案:

答案 0 :(得分:0)

您需要使用一个递归函数,该函数将删除所有null值,如果它具有一个对象或数组的值,则需要清除它,依此类推。如果清理的对象/数组为空,则可以跳过。

使用lodash时,您可以使用_.transform()来处理数组和对象。

const deepClean = obj => _.transform(obj, (acc, value, key) => {
  if(_.isNull(value)) return; // ignore null values

  if (_.isObject(value)) { // handle objects / arrays
    const cleanObj = deepClean(value) // clean the object

    if(!_.isEmpty(cleanObj)) acc[key] = cleanObj  // if it's not empty assign it to current key
  } else { // handle primitives
    acc[key] = value // assign value to current key
  }
})

console.log(deepClean(fooObject = {
  firstName: 'John',
  lastName: null,
  age: 43,
  address: {
    city: null,
    country: null
  }
}))

console.log(deepClean(fooObject = {
  firstName: 'John',
  lastName: null,
  age: 43,
  address: {
    city: null,
    country: 'Spain',
  }
}))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script>

答案 1 :(得分:0)

您可以使用reduce方法创建递归函数,该方法将遍历对象的多个级别并创建没有任何空值的新对象。

const a = {"firstName":"John","lastName":null,"age":43,"address":{"city":null,"country":null}}
const b = {"firstName":"John","lastName":null,"age":43,"address":{"city":null,"country":null, random: { foo: null, baz: 1}}}

function removeNulls(data) {
  return Object.entries(data)
    .reduce((r, [k, v]) => {
      if (v !== null) {
        if (typeof v === 'object') {
          const child = removeNulls(v);
          if (Object.keys(child).length) {
            r[k] = child
          }
        } else {
          r[k] = v;
        }
      }

      return r;
    }, {})
}

console.log(removeNulls(a))
console.log(removeNulls(b))

相关问题