当前位置: 首页 > 知识库问答 >
问题:

递归删除所有具有空值的JSON键,如果删除了所有子键,则删除父键

唐修诚
2023-03-14

我试图递归删除JSON对象和所有子对象中的空值。如果子对象的关键点都已删除,则我希望该子对象也被删除。

比如。

x = {
  "applicant": {
    'first_name': null,
    'last_name': null,
    'employment_type': null
  },
  'phone': 1123123,
  'branch': null,
  'industry': {
    'id': 1,
    'name': null
  },
  "status": "333"
}

应该变成这样:

x = {
    'phone': 1123123,
    'industry': {
         "id": 1
     },
     "status": "333"
    }

下面是我编写的删除所有空值键的函数:

function delKeys(app){
  for(key in app){
    if(app[key] !== null && typeof(app[key]) === 'object'){
      delKeys(app[key])
    } 
    if(app[key] === null){
      delete app[key]
      }
  }

但这不会删除没有子项的父项:

因此,我得到的不是上面的结果,而是:

x = {
    "applicant":{},
    "phone":1123123,
    "industry":{
       'id': 1
     }
     "status": "333"
     }

如您所见,它不会删除申请人的密钥。我如何在函数中检查它?或者它是否需要编写在我调用delKeys()后调用的单独函数中?

还有,有人看到这达到了最大递归深度吗?我尝试过更大的JSON对象,它似乎达到了最大递归深度。如果能帮我调试一下,我将不胜感激

谢谢你。

共有3个答案

葛嘉悦
2023-03-14

之后

delKeys(app[key]);

你应该

delete app[key];

app[key]是一个空对象,而不是===null,所以它不会被下面的if块拾取。

尉迟明辉
2023-03-14

JSON有一个简单的解决方案。解析'revivier函数。该函数对每个元素执行,如果返回undefined,则该元素将从对象中删除。您可以检查此函数中的值是否为空,并返回未定义的,避免使用任何递归函数:

const a = {"applicant":{"first_name":null,"last_name":null,"employment_type":null},"phone":1123123,"branch":null,"industry":{"id":1,"name":null},"status":"333"};

const res = JSON.parse(JSON.stringify(a), (k, v) => {
  return (v === null // delete null values
    || (Array.isArray(v) && v.length === 0) // delete empty arrays
    || (typeof v === 'object' && Object.keys(v).length === 0)) // delete empty objects
      ? undefined : v // else return the value
});

console.log(res)
赵立果
2023-03-14

删除空密钥后,需要检查app[key]是否有密钥。

const x = {
  "applicant": {
    'first_name': null,
    'last_name': null,
    'employment_type': null
  },
  'phone': 1123123,
  'branch': null,
  'industry': {
    'id': 1,
    'name': null
  },
  "status": "333"
}

function isEmpty(obj) {
  for(var key in obj) return false;

  return true
}

function delKeys(app){
  for(var key in app){
    if(app[key] !== null && typeof(app[key]) === 'object'){
      delKeys(app[key])

      if(isEmpty(app[key])) {
        delete app[key]
      }
    } 
    if(app[key] === null){
      delete app[key]
    }
  }
}

delKeys(x)

console.log(x)
 类似资料:
  • 问题内容: 我以为那不是难事,但我想用String.replaceAll删除所有空行(或Java中仅包含空白和制表符的行)。 我的正则表达式如下所示: 但这是行不通的。 我环顾四周,但仅发现用于删除空白行而不包含空格或制表符的正则表达式。 问题答案: 试试这个: 请注意,正则表达式匹配空格,制表符或管道字符! 编辑 顺便说一句,正则表达式也可以解决问题。

  • 我有两个表,一个有复合主键,另一个有外键。它们都设置为删除时级联。问题是,当我从主表中删除一个复合键集“name:John date:02.02.2018”时,所有John行都会从带有外键的表中删除,但是可以有一个集合“name:John date:04.04.2018”以及日期为02.02的所有行。也删除了一些行,如何才能使其删除仅匹配外键集的行? 更新:

  • 这是带有Resharper终极试用版的Visual Studio 2015

  • 通过特定的标签/键从整个JSON中删除任意值的简单方法是什么?我的JSON可能具有任意深度,因此按标签删除应该递归完成。 并且我想删除所有带有标签的元素,以便最终结果如下所示: 使用/会产生意想不到的结果(尤其是当有嵌套对象要删除时),因此它必须是一个支持JSON的实用工具,如jq或类似工具。

  • 根据给定的数据结构(json文件),我基本上需要呈现一个表。不应呈现空的行和/或列。我对JavaScript相当陌生,并尝试了不同的方法(转换为数组并使用.map()、reduce()。过滤器()和lodash等)没有成功。我甚至不知道解决这个问题的最佳方法是什么。(或者可能的搜索词是什么。) 行键(例如:mo、tu、we、th、fr)和列键(john、hane、doe)都不是已知的,并且可以变化

  • 问题内容: 在Hibernate中删除表中所有行 的最佳方法是什么? 如果我遍历一个集合并称其在我所知范围内没有执行。 如果使用其他选项,则不会影响持久性上下文。 如果没有更好的选择,何时应该使用这些方法? 问题答案: 如果没有什么要层叠的,请使用HQL删除 如果您有层叠,请迭代该集合并分别删除每个集合。 问题出在以下事实:hibernate在内部处理级联,而不是将其留给数据库。因此,发送查询不会