javascript - 动态删除复杂 JSON 数据中的空键(使用 vanilla JavaScript)

标签 javascript json

我尝试了许多不同的方法,仅使用 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/

相关文章:

javascript - iBooks 使用 HTML 小部件测试互联网连接

java - Apache Camel XmlJsonDataFormat XML 到 JSON

c# - 无法将类型为 'Newtonsoft.Json.Linq.JArray' 的对象转换为类型 'System.Collections.Generic.List`

arrays - 过滤器以在 Angular js 中对 JSON 数据进行排序

javascript - 如何逐步为 6 个盒子制作动画?

javascript - : Calling array. prototype.push 一次包含所有元素或推送每个元素一次哪个性能更高?

javascript - 什么是切换 javascript 计时器的更优雅的方式

javascript - 使用 Javascript 在 URL 中获取 searchTerms 结果查询的双引号

java - 如何使用 Jackson 将对象转换为使用默认类型的 map ?

javascript - Three.js materialLoader 不加载嵌入的纹理图像