js object flatten:深循环Json对象,然后展平对象?

问题描述 投票:-4回答:1

我的JSON对象数据:

{
    "title": "aa",
    "desc": ["i", "j", "k"],
    "cnt": {
        "head": "bb",
        "main": {
            "num1": {
                "time1": "mm",
                "time2": "kk"
            },
            "num2": "dd"
        }
    }
}

我的问题是:如何使用JavaScript将上述JSON对象转换为以下内容?

{
    "title": "aa", 
    "desc": ["i", "j", "k"],
    "cnt_head": "bb",
    "cnt_main_num1_time1": "mm",
    "cnt_main_num1_time2": "kk",
    "cnt_main_num2": "dd"
}

我尝试使用for(i in obj) {....}但失败了!

请帮忙!

javascript json object flatten
1个回答
1
投票

您基本上是在询问如何使用代表嵌套路径的键来展平嵌套对象。这是一个小的递归函数,它可以做到这一点:

const flatten = (o, pre) => Object.entries(o).reduce((a, [k, v]) => (
  key = pre ? `${pre}_${k}`: k,
  {
    ...a,
    ...Object.getPrototypeOf(v) !== Object.prototype ? {[key]: v} : flatten(v, key)
  }), {});

完整片段:

const o = {
    "title": "aa",
    "desc": ["i", "j", "k"],
    "cnt": {
        "head": "bb",
        "main": {
            "num1": {
                "time1": "mm",
                "time2": "kk"
            },
            "num2": "dd"
        }
    }
};

const flatten = (o, pre) => Object.entries(o).reduce((a, [k, v]) => (
  key = pre ? `${pre}_${k}`: k,
  {
    ...a,
    ...Object.getPrototypeOf(v) !== Object.prototype ? {[key]: v} : flatten(v, key)
  }), {});

console.log(flatten(o));
© www.soinside.com 2019 - 2024. All rights reserved.