Как написать функцию, которая проходит через глубоко вложенный объект формы схемы json? - PullRequest
0 голосов
/ 05 декабря 2018

Я работаю с объектами формы схемы json, и у нас есть очень глубоко вложенные объекты.Чтобы добавить новые функции, иногда нам нужно «делать то же самое» с каждым дочерним объектом, который соответствует определенным критериям.

Корневой объект похож на

                        "MainApplicant": {
                        "type": "object",
                        "title": "Main Applicant",
                        "properties": {
                            "birthDetails": {
                                "type": "object",
                                "title": "Birth Details",
                                "key": "birthDetails",
                                "properties": {
                                    "dateOfBirth": {
                                        "type": "string",
                                        "title": "Date of Birth",
                                        "key": "dateOfBirth",
                                        "format": "date"
                                    },
                                    "countryOfBirth": {
                                        "type": "string",
                                        "title": "Country of Birth",
                                        "key": "countryOfBirth",
                                    },
                                },

.количество уровней глубоко.

Сейчас я делаю то, что мне нужно делать, делая ..

Object.keys(properties).forEach(function(key) {
  // console.log("dealing with key ",key,properties[key])

  if (uischema[key] == undefined) {
    uischema[key] = {}
  }
  if (properties[key].type == "object") {


    console.log(key + " is a lvl2 Object!")
    Object.keys(properties[key].properties).forEach(function(key2) {
      if (uischema[key][key2] == undefined) {
        uischema[key][key2] = {}
      }
      if (properties[key].properties[key2].type == "object") {

        // console.log(key2 + " is a lvl3 Object!",properties[key].properties[key2].properties,uischema[key])
        Object.keys(properties[key].properties[key2].properties).forEach(function(key3) {
          if (uischema[key][key2][key3] == undefined) {
            uischema[key][key2][key3] = {}
          }
          if (properties[key].properties[key2].properties[key3].type == "object") {

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

его супер хром, но я понятия не имею, как написать для него функцию зацикливания.

почти попал в библиотеку шуток, которая позволяет goto в javascript!

1 Ответ

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

Я использовал рекурсию. Вот код:

var i=0
var properties={ "MainApplicant": {
                        "type": "object",
                        "title": "Main Applicant",
                        "properties": {
                            "birthDetails": {
                                "type": "object",
                                "title": "Birth Details",
                                "key": "birthDetails",
                                "properties": {
                                    "dateOfBirth": {
                                        "type": "string",
                                        "title": "Date of Birth",
                                        "key": "dateOfBirth",
                                        "format": "date"
                                    },
                                    "countryOfBirth": {
                                        "type": "string",
                                        "title": "Country of Birth",
                                        "key": "countryOfBirth",
                                    },
                                }
                              }
                            }
                          }
                        }

  function driller(data){
    Object.keys(data).forEach(key=>{

      //console.log(JSON.stringify(data[key]));
      if(typeof(data[key])==='object'){
        console.log(JSON.stringify(data[key]));
        driller(data[key])
      }
    })
  }
 driller(properties)

А вот и вывод:

E:\Nodetest>node server.js
   {"type":"object","title":"Main Applicant","properties":{"birthDetails":{"type":"object","title":"Birth Details","key":"birthDetails","properties":{"dateOfBirth":{"type":"string","title":"Date of Birth","key":"dateOfBirth","format":"date"},"countryOfBirth":{"type":"string","title":"Country of Birth","key":"countryOfBirth"}}}}}

{"birthDetails":{"type":"object","title":"Birth Details","key":"birthDetails","properties":{"dateOfBirth":{"type":"string","title":"Date of Birth","key":"dateOfBirth","format":"date"},"countryOfBirth":{"type":"string","title":"Country of Birth","key":"countryOfBirth"}}}}

{"type":"object","title":"Birth Details","key":"birthDetails","properties":{"dateOfBirth":{"type":"string","title":"Date of Birth","key":"dateOfBirth","format":"date"},"countryOfBirth":{"type":"string","title":"Country of Birth","key":"countryOfBirth"}}}

{"dateOfBirth":{"type":"string","title":"Date of Birth","key":"dateOfBirth","format":"date"},"countryOfBirth":{"type":"string","title":"Country of Birth","key":"countryOfBirth"}}

{"type":"string","title":"Date of Birth","key":"dateOfBirth","format":"date"}

{"type":"string","title":"Country of Birth","key":"countryOfBirth"} 
...