Как я могу динамически преобразовать глубокие объекты JS с массивами в объект JS без массивов в JavaScript? - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть массив объектов с идентификатором в качестве ключа для каждого объекта.Каждый объект представляет собой список навигации для идентификатора.

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

Полученный объект не должен содержать массив, нолистья, которые будут списком идентификаторов.

Я уже пробовал рекурсивные решения, функции lodash, такие как слияние и назначение, но я застрял с глубиной объектов

Входной JSON, например:

[
  {
    "id0": [
      {
        "Topitem 1": [
          {
            "Subitem 1": [
              "Leaf 1"
            ]
          }, {
            "Subitem 2": [
              "Leaf 2"
            ]
          }
        ]
      },
      {
        "Topitem 1": [
          {
            "Subitem 3": [
              "Leaf 1"
            ]
          }
        ]
      },
      {
        "Topitem 2": [
          "Leaf 1",
          "Leaf 3"
        ]
      },
      {
        "Topitem 3": [
          {
            "Subitem 1": [
              {
                "SubSubitem 1": [
                  "Leaf 4"
                ]
              }
            ]
          }
        ]
      }
    ]
  },
  {
    "id1": [
      "Leaf 5"
    ]
  },
  {
    "id2": [
      "Leaf 5"
    ]
  },
  {
    "id3": [
      {
        "Topitem 1": [
          "Leaf 1",
          {
            "Subitem 2": [
              "Leaf 2",
              "Leaf 3"
            ]
          }
        ]
      }, {
        "Topitem 2": [
          "Leaf 1",
          "Leaf 2"
        ]
      }
    ]
  },
  {
    "id4": [
      "Leaf 5"
    ]
  }
]

Ожидаемый результат:

{
  "Topitem 1": {
    "Subitem 1": {
      "Leaf 1": ["id0"]
    },
    "Subitem 2": {
      "Leaf 2": ["id0","id3"],
      "Leaf 3": ["id3"]
    },
    "Subitem 3": {
      "Leaf 1": ["id0"]
    },
    "Leaf 1": ["id3"]
  },
  "Topitem 2": {
    "Leaf 1": ["id0","id3"],
    "Leaf 2": ["id0","id3"]
  },
  "Topitem 3": {
    "Subitem 1": {
      "SubSubitem 1": {
        "Leaf 4": ["id0"]
      }
    }
  },
  "Leaf5": ["id1","id2","id4"]
}

1 Ответ

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

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

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

function convert(array) {

    function iter(array, object, value) {
        array.forEach(o => {
            if (!o || typeof o !== 'object') {
                (object[o] = object[o] || []).push(value);
                return;
            }
            Object
                .entries(o)
                .forEach(([k, v]) => iter(v, object[k] = object[k] || {}, value));
        });
    }

    var result = {};
    array.forEach(o => Object.entries(o).forEach(([k, v]) => iter(v, result, k)));
    return result;
}

var data = [{ id0: [{ "Topitem 1": [{ "Subitem 1": ["Leaf 1"] }, { "Subitem 2": ["Leaf 2"] }] }, { "Topitem 1": [{ "Subitem 3": ["Leaf 1"] }] }, { "Topitem 2": ["Leaf 1", "Leaf 3"] }, { "Topitem 3": [{ "Subitem 1": [{ "SubSubitem 1": ["Leaf 4"] }] }] }] }, { id1: ["Leaf 5"] }, { id2: ["Leaf 5"] }, { id3: [{ "Topitem 1": ["Leaf 1", { "Subitem 2": ["Leaf 2", "Leaf 3"] }] }, { "Topitem 2": ["Leaf 1", "Leaf 2"] }] }, { id4: ["Leaf 5"] }];

console.log(convert(data));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...