js object flatten: глубокие циклы объектов Json , затем сгладить объекты? - PullRequest
0 голосов
/ 28 декабря 2018

Данные моего объекта JSON:

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

Мой вопрос: как мне перевести вышеуказанный объект JSON в нижеследующее с помощью JavaScript?

{
    "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) {....} но не удалось!

Пожалуйста, помогите!

1 Ответ

0 голосов
/ 28 декабря 2018

Вы в основном спрашиваете, как сгладить вложенный объект, с ключами, представляющими вложенный путь.Вот небольшая рекурсивная функция, которая делает именно это:

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...