8

我正在尝试从 JSON 对象中删除空/空元素,类似于 python webutil/util.py -> trim_nulls 方法的功能。我可以使用 Node 内置的东西,还是自定义方法。

例子:

var foo = {a: "val", b: null, c: { a: "child val", b: "sample", c: {}, d: 123 } };

预期结果:

foo = {a: "val", c: { a: "child val", b: "sample", d: 123 } };
4

6 回答 6

5

我不知道为什么人们会赞成我原来的答案,这是错误的(我猜他们看起来太快了,就像我一样)。无论如何,我不熟悉节点,所以我不知道它是否包含一些东西,但我认为你需要这样的东西才能在直接的 JS 中做到这一点:

var remove_empty = function ( target ) {

  Object.keys( target ).map( function ( key ) {

    if ( target[ key ] instanceof Object ) {

      if ( ! Object.keys( target[ key ] ).length && typeof target[ key ].getMonth !== 'function') {

        delete target[ key ];

      }

      else {

        remove_empty( target[ key ] );

      }

    }

    else if ( target[ key ] === null ) {

      delete target[ key ];

    }

  } );


  return target;

};

remove_empty( foo );

我没有用数组尝试这个foo——可能需要额外的逻辑来以不同的方式处理它。

于 2012-08-08T23:38:18.010 回答
4

你可以这样使用:

Object.keys(foo).forEach(index => (!foo[index] && foo[index] !== undefined) && delete foo[index]);
于 2019-03-07T08:35:41.447 回答
4

你可以使用这个:

let fooText = JSON.stringify(foo);
    
let filteredFoo = JSON.parse(objectLogText, (key, value) => {if(value !== null) return value});

JSON.parse() 文档

于 2021-04-14T03:18:11.157 回答
3

感谢所有帮助.. 我使用所有与 foo 一起使用的评论中的反馈拼凑了以下代码。

function trim_nulls(data) {
  var y;
  for (var x in data) {
    y = data[x];
    if (y==="null" || y===null || y==="" || typeof y === "undefined" || (y instanceof Object && Object.keys(y).length == 0)) {
      delete data[x];
    }
    if (y instanceof Object) y = trim_nulls(y);
  }
  return data;
}
于 2012-08-09T00:47:05.090 回答
2

我发现这是最优雅的方式。此外,我相信 JS 引擎已针对它进行了大量优化。

使用内置JSON.stringify(value[, replacer[, space]])功能。文档在这里

示例是在从外部 API 检索一些数据、相应地定义一些模型、获取所有无法定义或不需要的所有内容的结果和截断的上下文中:

function chop (obj, cb) {
  const valueBlacklist = [''];
  const keyBlacklist = ['_id', '__v'];

  let res = JSON.stringify(obj, function chopChop (key, value) {
    if (keyBlacklist.indexOf(key) > -1) {
      return undefined;
    }

    // this here checks against the array, but also for undefined
    // and empty array as value
    if (value === null || value === undefined || value.length < 0 || valueBlacklist.indexOf(value) > -1) {
      return undefined;
    }
    return value;
 })
 return cb(res);
}

在您的实施中。

// within your route handling you get the raw object `result`
chop(user, function (result) {
   var body = result || '';
   res.writeHead(200, {
      'Content-Length': Buffer.byteLength(body),
      'Content-Type': 'application/json'
   });
   res.write(body);
   // bang! finsihed.
   return res.end();
});

// end of route handling
于 2015-12-06T17:05:08.093 回答
1

您可以使用for循环过滤并输出到新的干净对象:

var cleanFoo = {};
for (var i in foo) {
  if (foo[i] !== null) {
    cleanFoo[i] = foo[i];
  }
}

如果您也需要处理子对象,则需要递归。

于 2012-08-08T23:43:30.397 回答