Переформатирование глубоко вложенного объекта JSON различной длины в массив упрощенных объектов - PullRequest
3 голосов
/ 01 апреля 2019

Я использую функцию уменьшения карты, чтобы объединить несколько входных данных в один объект, как упомянуто здесь .

Полученный уменьшенный Объект имеет следующий формат:

{
    "2019-04-02T00:00:00-04:00": {
        "2019-04-02T09:00:00-04:00": {
            "2019-04-02T18:00:00-04:00": {
                "[MET] L2 - NB": {
                    "attendees": [
                        "Lex Luthor",
                        "Lois Lane"
                    ]
                },
                "[MET] L2 -  CS": {
                    "attendees": [
                        "General Zod",
                        "Clark Kent"
                    ]
                }
            }
        }
    },
    "2019-04-03T00:00:00-04:00": {
        "2019-04-03T09:00:00-04:00": {
            "2019-04-03T18:00:00-04:00": {
                "[MET] L2 - NB": {
                    "attendees": [
                        "Lex Luthor",
                        "Lois Lane"
                    ]
                },
                "[MET] L2 -  CS": {
                    "attendees": [
                        "General Zod",
                        "Clark Kent"
                    ]
                }
            }
        }
    }
}

Однако я ищу способ переформатировать его в массив объектов, который позволит перебирать объекты и легко получать доступ ко всем данным:

[
    {
        Date: "2019-04-02T00:00:00-04:00",
        StartTimeLocalized: "2019-04-02T09:00:00-04:00",
        EndTimeLocalized: "2019-04-02T18:00:00-04:00",
        LabelWithCompany: "[MET] L2 - NB",
        attendees: [
            "Lex Luthor",
            "Lois Lane"
        ]
    }, {
        Date: "2019-04-02T00:00:00-04:00",
        StartTimeLocalized: "2019-04-02T09:00:00-04:00",
        EndTimeLocalized: "2019-04-02T18:00:00-04:00",
        LabelWithCompany: "[MET] L2 -  CS",
        attendees: [
            "General Zod",
            "Clark Kent"
        ]
    },
    {
        Date: "2019-04-03T00:00:00-04:00",
        StartTimeLocalized: "2019-04-03T09:00:00-04:00",
        EndTimeLocalized: "2019-04-03T18:00:00-04:00",
        LabelWithCompany: "[MET] L2 -  CS",
        attendees: [
            "Lex Luthor",
            "Lois Lane"
        ]
    },
    {
        Date: "2019-04-03T00:00:00-04:00",
        StartTimeLocalized: "2019-04-03T09:00:00-04:00",
        EndTimeLocalized: "2019-04-03T18:00:00-04:00",
        LabelWithCompany: "[MET] L2 -  CS",
        attendees: [
            "General Zod",
            "Clark Kent"
        ]
    }
]

Ответы [ 3 ]

2 голосов
/ 01 апреля 2019

Вы можете применить динамический подход, передав массив вложенных ключей и взяв все ключи для новых объектов.

function mapNestedObjects(object, keys) {
    function getNested(source, target, index) {
        Object.entries(source).forEach(([key, value]) => {
            if (index + 1 < keys.length) {
                getNested(value, { ...target, [keys[index]]: key }, index + 1);
            } else {
                result.push({ ...target, [keys[index]]: key, ...value });
            }
        });
    }

    var result = [];
    getNested(object, {}, 0);
    return result;
}

var object = { "2019-04-02T00:00:00-04:00": { "2019-04-02T09:00:00-04:00": { "2019-04-02T18:00:00-04:00": { "[MET] L2 - NB": { attendees: ["Lex Luthor", "Lois Lane"] }, "[MET] L2 -  CS": { attendees: ["General Zod", "Clark Kent"] } } } }, "2019-04-03T00:00:00-04:00": { "2019-04-03T09:00:00-04:00": { "2019-04-03T18:00:00-04:00": { "[MET] L2 - NB": { attendees: ["Lex Luthor", "Lois Lane"] }, "[MET] L2 -  CS": { attendees: ["General Zod", "Clark Kent"] } } } } },
    keys = ["Date", "StartTimeLocalized", "EndTimeLocalized", "LabelWithCompany"],
    result = mapNestedObjects(object, keys);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 01 апреля 2019

const obj = {
    "2019-04-02T00:00:00-04:00": {
        "2019-04-02T09:00:00-04:00": {
            "2019-04-02T18:00:00-04:00": {
                "[MET] L2 - NB": {
                    "attendees": [
                        "Lex Luthor",
                        "Lois Lane"
                    ]
                },
                "[MET] L2 - CS": {
                    "attendees": [
                        "General Zod",
                        "Clark Kent"
                    ]
                }
            }
        }
    },
    "2019-04-03T00:00:00-04:00": {
        "2019-04-03T09:00:00-04:00": {
            "2019-04-03T18:00:00-04:00": {
                "[MET] L2 - NB": {
                    "attendees": [
                        "Lex Luthor",
                        "Lois Lane"
                    ]
                },
                "[MET] L2 - CS": {
                    "attendees": [
                        "General Zod",
                        "Clark Kent"
                    ]
                }
            }
        }
    }
};

const getObjecta = (object, val) => {
  const a = {}, b = {};
  a.Date = val;
  b.Date = val;

  a.StartTimeLocalized = Object.keys(object)[0];
  b.StartTimeLocalized = Object.keys(object)[0];

  a.EndTimeLocalized = Object.keys(object[a.StartTimeLocalized])[0];
  b.EndTimeLocalized = Object.keys(object[b.StartTimeLocalized])[0];

  a.LabelWithCompany = '[MET] L2 - NB';
  b.LabelWithCompany = '[MET] L2 - CS';

  a.attendees = object[a.StartTimeLocalized][a.EndTimeLocalized]['[MET] L2 - NB']['attendees'];
  b.attendees = object[b.StartTimeLocalized][b.EndTimeLocalized]['[MET] L2 - CS']['attendees'];

  return [a, b];
};

let finalArray = [];

Object.keys(obj).forEach((val) => {
	finalArray = [...finalArray, ...getObjecta(obj[val], val)];
});

console.log(finalArray);
0 голосов
/ 01 апреля 2019

Вы можете иметь 4 уровня вложенных циклов и помещать результат в массив.Чтобы отобразить объект, вы можете использовать Object.entries для получения пар ключ-значение на каждом уровне в виде массива

var obj = {
    "2019-04-02T00:00:00-04:00": {
        "2019-04-02T09:00:00-04:00": {
            "2019-04-02T18:00:00-04:00": {
                "[MET] L2 - NB": {
                    "attendees": [
                        "Lex Luthor",
                        "Lois Lane"
                    ]
                },
                "[MET] L2 -  CS": {
                    "attendees": [
                        "General Zod",
                        "Clark Kent"
                    ]
                }
            }
        }
    },
    "2019-04-03T00:00:00-04:00": {
        "2019-04-03T09:00:00-04:00": {
            "2019-04-03T18:00:00-04:00": {
                "[MET] L2 - NB": {
                    "attendees": [
                        "Lex Luthor",
                        "Lois Lane"
                    ]
                },
                "[MET] L2 -  CS": {
                    "attendees": [
                        "General Zod",
                        "Clark Kent"
                    ]
                }
            }
        }
    }
}

const res = [];
Object.entries(obj).forEach(([date, value]) => {

  Object.entries(value).forEach(([start, value2]) => {
    Object.entries(value2).forEach(([end, value3]) => {
        Object.entries(value3).forEach(([label, value4]) => {
          res.push({
            Date: date,
            StartTimeLocalized: start,
            EndTimeLocalized: end,
            LabelWithCompany: label,
            attendees: value4.attendees
          })
        })
    })
  })
})

console.log(res)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...