【问题标题】:Convert nested JSON to simple in JS在 JS 中将嵌套的 JSON 转换为简单的
【发布时间】:2022-11-15 00:57:46
【问题描述】:

我想像这样转换嵌套的 JSON

{
    "dateSession": "14/11/2022",
    "HRdata": {
        "1": 86,
        "2": 88,
        "3": 86,
        "4": 85
    },
    "SPO2data": {
        "1": 98,
        "2": 97,
        "3": 97,
        "4": 96
    }
}

像这样:

{
    "dateSession": "14/11/2022",
    "HRdata-1": 86,
    "HRdata-2": 88,
    "HRdata-3": 86,
    "HRdata-4": 85,
    "SPO2data-1": 98,
    "SPO2data-2": 97,
    "SPO2data-3": 97,
    "SPO2data-4": 96,
}

其中嵌套对象中的每个字段都将被命名为 field+key 代表其实际路径。

我想用所有数据生成一个 csv,所以首先,我需要一个简单的 json 来导出数组。

【问题讨论】:

  • 那么你在进行对话时遇到了什么问题? Stackoverflow 收到很多关于“我有这种数据格式,我想要这种不同的数据格式,我根本没有共享任何代码”格式的问题,这更适合像 fiverr.com 这样的网站

标签: javascript arrays json nested export-to-csv


【解决方案1】:

你可以做:

const data = {"dateSession": "14/11/2022","HRdata": {"1": 86,"2": 88,"3": 86,"4": 85},"SPO2data": {"1": 98,"2": 97,"3": 97,"4": 96}}

const result = {}
Object.entries(data)
  .filter(([k, v]) => typeof v !== 'object') 
  .forEach(([k, v]) => result[k] = v ) 
Object.keys(data)
  .filter(k => !(k in result))
  .map(
    k => Object
      .entries(data[k])
      .forEach(([n, v]) => result[`${k}-${n}`] = v)
  )

console.log(result)

【讨论】:

    【解决方案2】:

    您基本上需要运行自己的解析器并手动映射键。 递归函数应该在此处执行此操作,您正在检查 typeof key === 'object' && !Array.isArray(key) 作为条件,以便递归回调并映射出新/最终对象。

    这是一个非常快速/肮脏/未经测试的示例......

    let result = {};
    const keysToMap = ['HRdata', 'SPO2data'];
    let currKey = '';
    
    const mapJson = (jsonData) => {
        const keys = Object.keys(jsonData);
        keys.forEach(key => {
            if (typeof jsonData[key] === 'object' && !Array.isArray(jsonData[key])) {
                currKey = key;
                mapJson(jsonData[key];
            } else {
                if (isNaN(key)) {
                    result[key] = jsonData[currKey][key];
                } else {
                  result[`${currKey}-${key}`] = jsonData[currKey][key];
                }
            }
        });
    });
    

    上面可以用许多更好的方式重构,但这是我能想到的最快的方法,所以我可以回去工作 lmfao。

    再次 - 以上是未经测试的。它并不完美,但它传达了主要思想:

    • 绘制对象
    • 有一些方法来确定你在一个需要展平的键上(这可以通过查找,或者你可能想提出的其他一些更聪明的评估)
    • 当您遇到需要展平的键时,发出回调并让递归为您完成工作

    我的解决方案的想法不是让它漂亮或高性能,而是通过浏览它来向您解释您想要做什么。

    上面的主要问题是它不能处理比​​你布置的更多的尺寸。如果你想这样做,你将不得不重新评估解决方案并做得更好。

    此外,这也不是一个很好的 O(n) 解决方案。我敢肯定那里有更好的。但同样 - 这只是让你开始,所以你可以重构你想要的最终解决方案。

    【讨论】:

      【解决方案3】:

      const data = {
        dateSession: '14/11/2022',
        HRdata: {
          1: 86,
          2: 88,
          3: 86,
          4: 85,
        },
        SPO2data: {
          1: 98,
          2: 97,
          3: 97,
          4: 96,
        },
      }
      
      const flattenedData = {}
      const flatten = (obj, oldName = '') => {
        //we are counting on the fact that we will get an object at first - you can add a condition to check it here
        const entries = Object.entries(obj)
        //iterate through the object. If we are encountering another object - send it again in recursion. If it's a value - add it to the flattened object
        for (const [key, value] of entries) {
          typeof value === 'object' && !Array.isArray(value)
            ? flatten(value, key + '-')
            : (flattenedData[oldName + key] = value)
        }
      }
      
      flatten(data)
      console.log(flattenedData)

      【讨论】:

        猜你喜欢
        • 2017-06-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-27
        • 2018-04-21
        • 2018-01-07
        • 2020-10-28
        • 1970-01-01
        • 2019-09-28
        相关资源
        最近更新 更多