【问题标题】:js object flatten:Deep loop Json objects, then flatten the objects? [duplicate]js对象展平:深循环Json对象,然后展平对象? [复制]
【发布时间】:2019-05-25 23:12:07
【问题描述】:

我的 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) {....},但失败了!

请帮忙!

【问题讨论】:

  • 发布的问题似乎根本没有包含any attempt 来解决问题。 StackOverflow 期待您 try to solve your own problem first,因为您的尝试有助于我们更好地了解您想要什么。请编辑问题以显示您尝试过的内容,以说明您遇到minimal reproducible example 的特定障碍。欲了解更多信息,请参阅How to Ask 并拨打tour
  • 如果您曾尝试使用for(i in obj) {....},提出此问题的更好方法是显示这些尝试、失败的原因,并寻求具体帮助。

标签: javascript json object flatten


【解决方案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)
  }), {});

完整的sn-p:

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));

【讨论】:

  • 解决了我的问题,非常感谢!希望这也可以帮助其他一些人。
猜你喜欢
  • 2021-03-05
  • 2014-01-05
  • 1970-01-01
  • 2019-01-17
  • 2017-06-13
  • 2020-07-04
  • 1970-01-01
  • 2016-12-26
  • 2021-10-19
相关资源
最近更新 更多