【问题标题】:Remove empty objects, arrays, strings or integers from an object从对象中删除空对象、数组、字符串或整数
【发布时间】:2020-02-01 08:51:57
【问题描述】:

我有以下 sn-p 不起作用,并决定将其隔离到 nodejs 脚本中:

const _ = require('lodash');

let derpObject = {
    foo: "hey",
    bar: "",
    foo2: [],
    bar2: {}
}

function cleanObject(params) {
    const newObject = Object.keys(params).forEach( key => {
    console.log(params[key]);
        if(_.isNil(params[key]) || _.isEmpty(params[key])) {
      delete params[key]
    }
    });
  console.log('here', newObject);
  return newObject;
}

let result = cleanObject(derpObject);
console.log(result);

基本上,我的目的是检查主对象中哪些属性为空或 null 并删除它们,最后返回仅具有非空/null 属性的新对象。

但是,运行上面的脚本输出:

hey

[]
{}
here undefined
undefined
=> undefined

知道为什么我会变得不确定吗?我一直在用这个敲打我的头一段时间了

【问题讨论】:

  • forEach 不返回任何内容
  • 你正在改变原始对象,所以只需 return params
  • 为什么不利用 Lodash 功能:_.filter(derpObject, (e) => !_.isEmpty(e)).

标签: javascript node.js object ecmascript-6


【解决方案1】:

.forEach() 不返回任何内容因此undefined 输出,您可以尝试将值分配给新对象并避免更改原始对象:

function cleanObject(params) {
  const newObject = {};
  Object.keys(params).forEach(key => {
    //console.log(params[key]);
    if (!(_.isNil(params[key]) || _.isEmpty(params[key]))) {
        newObject[key] = params[key]
    }
  });
  //console.log('here', newObject);
  return newObject;
}

let derpObject = {
  foo: "hey",
  bar: "",
  foo2: [],
  bar2: {}
}

function cleanObject(params) {
  const newObject = {};
  Object.keys(params).forEach(key => {
    //console.log(params[key]);
    if (!(_.isNil(params[key]) || _.isEmpty(params[key]))) {
        newObject[key] = params[key]
    }
  });
  //console.log('here', newObject);
  return newObject;
}

let result = cleanObject(derpObject);
console.log(result);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>

纯lodash:

function cleanObject(params) {
  return _(params).omitBy(_.isNil).omitBy(_.isEmpty);
}

let derpObject = {
  foo: "hey",
  bar: "",
  foo2: [],
  bar2: {}
}

function cleanObject(params) {
  return _(params).omitBy(_.isNil).omitBy(_.isEmpty);
}

console.log(cleanObject(derpObject));
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>

【讨论】:

    【解决方案2】:

    我想你快到了。我稍微更改了逻辑,以便在值有效时添加对象键和值(不为 nil 或不为空)

    function cleanObject(params) {
        let newObject = {};
        Object.keys(params).forEach( key => {
            console.log(params[key]);
            if(!_.isNil(params[key]) || !_.isEmpty(params[key])) {
                newObject[key] = params[key]
            }
        });
      console.log('here', newObject);
      return newObject;
    }
    

    【讨论】:

      【解决方案3】:

      您可以将Array.prototype.reduce()Lodash#isNil()Lodash#isEmpty() 结合使用

      代码:

      const derpObject = {
        foo: "hey",
        bar: "",
        foo2: [],
        bar2: {}
      }
      const cleanObject = (o) => Object
        .keys(o)
        .reduce((a, k) => {
          if (!(_.isNil(o[k]) || _.isEmpty(o[k]))) {
            a[k] = o[k]
          }
          return a
        },{})
      const result = cleanObject(derpObject)
      
      console.log(result)
      <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>

      【讨论】:

        猜你喜欢
        • 2021-01-04
        • 1970-01-01
        • 2016-11-26
        • 2016-01-03
        • 1970-01-01
        • 1970-01-01
        • 2015-12-24
        • 2015-08-29
        • 1970-01-01
        相关资源
        最近更新 更多