Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态删除复杂JSON数据中的空键(使用普通JavaScript)_Javascript_Json - Fatal编程技术网

动态删除复杂JSON数据中的空键(使用普通JavaScript)

动态删除复杂JSON数据中的空键(使用普通JavaScript),javascript,json,Javascript,Json,我尝试了许多不同的方法,仅使用JavaScript从JSON文件中动态解析和删除带有空值的键 到目前为止,我已经能够删除未嵌套的键,但长度大于0的空字符串除外 我的主要问题是如何访问子值,计算嵌套键并只删除嵌套键-现在我最终删除根键 请原谅,如果这是一个重复的问题,但我找不到任何具体的情况下,在这里或其他地方为我工作的实施 以下是我到目前为止的情况: //数据 让输入=“{”姓氏“:”史密斯“,”电子邮件“:”简。smith@wyng.com“,”性别“:”空,“邀请函“:[{”发件人“:”测

我尝试了许多不同的方法,仅使用JavaScript从JSON文件中动态解析和删除带有空值的键

到目前为止,我已经能够删除未嵌套的键,但长度大于0的空字符串除外

我的主要问题是如何访问子值,计算嵌套键并只删除嵌套键-现在我最终删除根键

请原谅,如果这是一个重复的问题,但我找不到任何具体的情况下,在这里或其他地方为我工作的实施

以下是我到目前为止的情况:

//数据
让输入=“{”姓氏“:”史密斯“,”电子邮件“:”简。smith@wyng.com“,”性别“:”空,“邀请函“:[{”发件人“:”测试“,”代码“:”}],”公司“:{”姓名“:”dds“,”行业“:[”}”,地址“{”城市“:”纽约“,”州“:”纽约“,”邮政“:”10011“,”街道“:”,”新值“:”}”;
//主要功能
函数removeEmptyFields(inputJSON){
让data=JSON.parse(inputJSON);
//访问顶级密钥(案例1)
for(让我们输入数据){
设项=数据[键];
//如果价值不在顶层,则深入挖掘
if(item!==null&&typeof item!==object){
删除记录(项目)
}否则{
(项目)
}
if(item==null&&typeof item===object){
删除记录(项目)
}
//删除空记录的函数
功能删除记录(项目){
//console.log(item+“#”);//删除空记录的函数
如果(项===null | |项===未定义||
item.length==0){
删除数据[键];
}
}
//函数访问嵌套在一个级别上的值(案例2)
函数(键){
if(typeof key=='object'&&typeof key!=null){
for(让键2输入键){
if(键的类型[key2]=='object'&键的类型[key2]!=null){
console.log()
for(让子项在键[key2]中){
//删除记录(键2[子项])
}
}
删除记录(项目[key2])
查找深度(项目[key2]);
}
}
}
}
返回数据;
}
让输出=removeEmptyFields(输入)
控制台日志(输出);
//案例:
//1->平面对象:
//数据[键]
//2->数组/对象
//数据[键][数组索引]
//3->对象/对象
//数据[键][子键]
//4->对象/对象/数组
//数据[键][子键][数组索引]

//按顺序测试用例,并在最后删除空值。结果返回数据
如果您修复了递归调用并删除了所有不必要的结果,您实际上已经非常接近了:

function cleanUp(obj) {
  for(const key in obj) {
    const value = obj[key];
    if(typeof value === "object") {
      cleanUp(value);
    } else if(!value && value !== 0) {
      delete obj[key];
    }
  }
}

let output = JSON.parse(input);
cleanUp(output);

如果您修复了递归调用并删除了所有不必要的内容,那么您实际上已经非常接近了:

function cleanUp(obj) {
  for(const key in obj) {
    const value = obj[key];
    if(typeof value === "object") {
      cleanUp(value);
    } else if(!value && value !== 0) {
      delete obj[key];
    }
  }
}

let output = JSON.parse(input);
cleanUp(output);
找到了一种方法。 感谢所有做出贡献的人:

//DATA
let input = '{"first_name": "","last_name": "Smith","email":"jane.smith@wyng.com","gender": null,"invitations": [{"from": "test","code": ""}],"company": {"name": "dds","industries": [""]},"address": {"city": "New York","state": "NY","zip": "10011","street": " "},"new Value": ""}';




function isEmpty(value) {
    if (value === null)
        return true;

    if (typeof value == 'object' && Object.keys(value).length === 0)
        return true;

    if (typeof value == 'string' && value.trim() == '')
        return true;

    return false;
}

function removeEmptyFields(input) {
    if (Array.isArray(input)) {
        for (var index = input.length - 1; index >= 0; index--) {
            if (typeof input[index] == 'object') {
                removeEmptyFields(input[index]);
            }
            if (isEmpty(input[index])) {
                input.splice(index, 1);
            }
        }
    } else {
        for (var index in input) {
            if (typeof input[index] == 'object') {
                removeEmptyFields(input[index]);
            }
            if (isEmpty(input[index])) {
                delete input[index];
            }

        }

    }
    return input
}
找到了一种方法。 感谢所有做出贡献的人:

//DATA
let input = '{"first_name": "","last_name": "Smith","email":"jane.smith@wyng.com","gender": null,"invitations": [{"from": "test","code": ""}],"company": {"name": "dds","industries": [""]},"address": {"city": "New York","state": "NY","zip": "10011","street": " "},"new Value": ""}';




function isEmpty(value) {
    if (value === null)
        return true;

    if (typeof value == 'object' && Object.keys(value).length === 0)
        return true;

    if (typeof value == 'string' && value.trim() == '')
        return true;

    return false;
}

function removeEmptyFields(input) {
    if (Array.isArray(input)) {
        for (var index = input.length - 1; index >= 0; index--) {
            if (typeof input[index] == 'object') {
                removeEmptyFields(input[index]);
            }
            if (isEmpty(input[index])) {
                input.splice(index, 1);
            }
        }
    } else {
        for (var index in input) {
            if (typeof input[index] == 'object') {
                removeEmptyFields(input[index]);
            }
            if (isEmpty(input[index])) {
                delete input[index];
            }

        }

    }
    return input
}

item===null&&typeof item==='object'
这从来都不是真的。谢谢你,乔纳斯,我要检查一下这方面的文档。
lookdeep
需要一个键,你传递一个值
lookdeep(item[key2])@JonasW
typeof null
是“object”…
item===null&&typeof item===“object”
这从来都不是真的。谢谢你,乔纳斯,我要检查一下这方面的文档。
lookDeeper
需要一个键,你传递一个值
lookDeeper(item[key2])@JonasW
typeof null
是“object”…感谢您花时间回答Jonas。不幸的是,我的输出不是我所需要的。例如,我需要从输出中删除“邀请”、“街道”和“性别”。我认为缺少的是对键内对象的更深入迭代。仍在努力实现它感谢您花时间回答Jonas。不幸的是,我的输出不是我所需要的。例如,我需要从输出中删除“邀请”、“街道”和“性别”。我认为缺少的是对键内对象的更深入迭代。仍在努力实施它