Node.js - 从JSON对象中删除null元素

9

我想要从JSON对象中删除null/空元素,类似于Python的webutil/util.py中的trim_nulls方法。Node.js中是否内置了此功能,还是需要自己编写一个方法?

示例:

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

1
你可以循环遍历所有元素,如果它们为 null,则将其取消设置。 - JCOC611
1
看看这个答案。 这里有一个对你有用的脚本。https://dev59.com/CkbRa4cB1Zd3GeqP030T#525181 - B4LB0
可能是重复的问题:如何检查空的 JSON 并避免输出? - joran
你是真的指JSON对象,还是指JavaScript对象?你的标题和描述说的是JSON,但你的示例代码是JavaScript。 - JMM
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 中使用数组 - 可能需要额外的逻辑来处理。


5
你可以使用这个:
let fooText = JSON.stringify(foo);
    
let filteredFoo = JSON.parse(objectLogText, (key, value) => {if(value !== null) return value});

JSON.parse()文档


4
您可以像这样使用:
Object.keys(foo).forEach(index => (!foo[index] && foo[index] !== undefined) && delete foo[index]);

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

那会移除0吗?这是有意为之的吗? - JMM
是的,说得好,我会更改“if(!y”语句以适应。感谢您指出这一点。 - Steve Davis

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

1
非常优雅,一直使用 stringify,从未想过以这种方式使用它,很棒。 - Symonty

1

你可以使用一个 for 循环进行过滤,并输出到一个新的干净对象:

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

如果您需要处理子对象,那么您将需要使用递归。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接