Javascript json во вложенные json - PullRequest
0 голосов
/ 26 марта 2020

У меня есть огромный json, который я извлекаю из листа Excel. Данные, которые я получаю в виде массива объектов, и один объект выглядит следующим образом.

[
  {
    "key": "guid",
    "parent": "id__guid"
  },
  {
    "key": "version",
    "parent": "id__version"
  },
  {
    "key": "register",
    "parent": "register"
  },
  {
    "key": "offloadId",
    "parent": "offloadId"
  },
  {
    "key": "action",
    "parent": "action"
  },
  {
    "key": "reported",
    "parent": "reported"
  },
  {
    "key": "control",
    "parent": "control"
  },
  {
    "key": "AppNum",
    "parent": "Identification__AppNum"
  },
  {
    "key": "DataTp",
    "parent": "Identification__DataTp"
  },
  {
    "key": "DtOgWatchDt",
    "parent": "Identification__DtOgWatchDt"
  },
  {
    "key": "DtPendingWatchDt",
    "parent": "Identification__DtPendingWatchDt"
  },
  {
    "key": "IssRef",
    "parent": "Identification__IssRef"
  },
  {
    "key": "ImgRef",
    "parent": "Identification__ImgRef"
  },
  {
    "key": "Register",
    "parent": "Identification__Register"
  },
  {
    "key": "-",
    "parent": "Identification__ImgRefFullPub"
  },
  {
    "key": "DtAppDt",
    "parent": "Dates__DtAppDt"
  },
  {
    "key": "IdxNam",
    "parent": "Description__IdxNam"
  },
  {
    "key": "Clms",
    "parent": "Description__Clms"
  },
  {
    "key": "Disclaims",
    "parent": "Description__Disclaims"
  },
  {
    "key": "LglStsCd",
    "parent": "Status__LglStsCd"
  },
  {
    "key": "UsPtoStsCd",
    "parent": "Status__UsPtoStsCd"
  },
  {
    "key": "PtoStsCdDt",
    "parent": "Status__PtoStsCdDt"
  },
  {
    "key": "StsFlag",
    "parent": "Status__StsFlag"
  },
  {
    "key": "SrcInd",
    "parent": "Status__SrcInd"
  },
  {
    "key": "LglStsCdNorm",
    "parent": "Status__LglStsCdNorm"
  }
]

Я хочу преобразовать их в этот вложенный формат json.

[
  {
    name: "Identification",
    fields: [
      {
        "key": "AppNum",
        "parent": "Identification__AppNum"
      },
      {
        "key": "DataTp",
        "parent": "Identification__DataTp"
      },
      {
        "key": "DtOgWatchDt"
      },
      {
        "key": "DtPendingWatchDt"
      },
      {
        "key": "IssRef"
      },
      {
        "key": "ImgRef"
      },
      {
        "key": "Register"
      },
      {
        "key": "ImgRefFullPub"
      },
      {
        "key": "guid"
      },
      {
        "key": "version"
      },
      {
        "key": "offloadid"
      },
      {
        "key": "reported"
      },
      {
        "key": "control"
      }
    ]
  },
  {
    name: "Description",
    fields: [
      {
        "key": "IdxNam"
      },
      {
        "key": "Clms"
      },
      {
        "key": "Disclaims"
      }
    ]
  },
  {
    name: "Status",
    fields: [
      {
        "key": "UsPtoStsCd"
      },
      {
        "key": "PtoStsCdDt"
      },
      {
        "key": "LglStsCd"
      },
      {
        "key": "StsFlag"
      },
      {
        "key": "SrcInd"
      },
      {
        "key": "LglStsCdNorm"
      }
    ]
  },
  {
    name: "Dates",
    fields: [
      {
        "key": "DtAppDt"
      }
    ]
  }
]

Как вы можно увидеть в соответствии с родительским ключом, мы должны создать вложенную структуру. Я перепробовал все способы, я также много искал в Google, но не повезло.

Любая помощь будет оценена.

1 Ответ

1 голос
/ 26 марта 2020

Вы захотите создать новый массив объектов, затем l oop через исходный массив и добавить записи в новый массив на основе этого. Например -

const input = [
  {
    "key": "guid",
    "parent": "id__guid"
  },
  {
    "key": "version",
    "parent": "id__version"
  }
  // et cetera... your input
];

// these are buckets.
const transformedObject = {
  "Identification": []
}

// First we put the data into the right buckets
input.forEach((entry) => {

  // Create a new object with the key
  const newObject = { key: entry.key };

  // By default, the parent seems to be "Identification"
  let parentKey = "Identification";

  // Find out if the parent's name has an underscore?
  if (entry.parent.split("__").length > 1) {

    // If so, that's the new parent
    parentKey = entry.parent.split("__")[0];

  }

  // If there isn't an array for this parent, make one
  if (!transformedObject[parentKey]) {
    transformedObject[parentKey] = [];
  }

  transformedObject[parentKey].push(newObject);  

})

const output = [];

// Then we need to shape the data
Object.keys(transformedObject).forEach((parentKey) => {
  const parentGroup = {
    name: parentKey,
    fields: transformedObject[parentKey]
  };
  output.push(parentGroup);
});


console.log(output);

Вы заметите, что это не поможет вам в этом. Кажется, префикс «id» объединен с префиксом «Identification», и вы хотите сохранить родительское значение для некоторых из этих объектов. Вам понадобятся некоторые условные обозначения, или карта, или что-то еще, чтобы эта часть работала. Но я надеюсь, что это начало!

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