我尝试了许多不同的方法,仅使用 JavaScript 从 JSON 文件动态解析和删除具有空值的键。
到目前为止,我已经能够删除未嵌套的键,但长度大于 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
最佳答案
如果您修复递归调用并删除最终得到的所有不必要的内容,您实际上已经非常接近了:
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);
关于javascript - 动态删除复杂 JSON 数据中的空键(使用 vanilla JavaScript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50493996/