javascript - 动态删除复杂 JSON 数据中的空键(使用 vanilla JavaScript)
问题描述
我尝试了许多不同的方法来从 JSON 文件中动态解析和删除具有空值的键,仅使用 JavaScript。
到目前为止,我已经能够删除未嵌套的键,长度大于 0 的空字符串除外。
我的主要问题是如何访问子值,评估嵌套键并仅删除嵌套键 - 现在我最终删除了根键。
如果这是一个重复的问题,请原谅,但我找不到任何适用于我在这里或其他地方的特殊案例的实现。
这是我到目前为止所拥有的:
//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": ""}';
//MAIN FUNCTION
function removeEmptyFields(inputJSON) {
let data = JSON.parse(inputJSON);
//accessing top level keys (case1)
for (let key in data) {
let item = data[key];
//dig deeper if value not at top level
if (item !== null && typeof item !== 'object') {
deleteRecord(item)
} else {
lookDeeper(item)
}
if (item === null && typeof item === 'object') {
deleteRecord(item)
}
//function that deletes empty records
function deleteRecord(item) {
// console.log(item + "#");//function that deletes empty records
if (item === null || item === undefined ||
item.length === 0) {
delete data[key];
}
}
//function to access values nested one level (case2)
function lookDeeper(key) {
if (typeof key === 'object' && typeof key != null) {
for (let key2 in key) {
if (typeof key[key2] === 'object' && typeof key[key2] != null) {
console.log()
for (let subItem in key[key2]) {
// deleteRecord(key2[subItem])
}
}
deleteRecord(item[key2])
lookDeeper(item[key2]);
}
}
}
}
return data;
}
let output = removeEmptyFields(input)
console.log(output);
//CASES:
//1-> flat object:
//data[key]
//2 -> array/object
//data[key][array-index]
//3 ->object/object
//data[key][subkey]
//4 ->object/object/array
//data[key][subkey][array-index]
// Test cases in order, and delete nulls at the very end. return data as result
解决方案
Youre actually quite close, if you fix the recursive call and remove all the unneccessary you end up with:
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);
推荐阅读
- c# - How to update carousel view in c# Xamarin?
- java - 我们如何在 Android 中运行测试用例
- logstash - 绕过Logstash混合日志的解决方案
- jenkins - 来自 Gitlab 的结帐在 Jenkins 管道中失败
- excel - 在不打开文件的情况下确定 .txt 或 .csv 文件的分隔符
- windows - xxxxxx 不是有效路径。确保路径名是
- node.js - 如何使用循环发送电子邮件并更新每条记录?
- php - 使用字符串搜索对象数组的 PHP 函数
- python - 如何修复通过 expr 中的括号的循环
- c# - 有没有办法取消取消任务中方法的执行?