Создать структуру вложенного объекта из плоской - PullRequest
0 голосов
/ 21 ноября 2018

Если кто-нибудь может сказать мне, пожалуйста, как я могу сделать из этой структуры плоского объекта:

mainObj = {
    "Ob1": {
        "id": 1,
        "name": "Ob1",
        "properties": {
            "attName": "A1",
            "attType": "string",
            "attOccurance": "minOccurs="1""
        },
    },
    "Ob2": {
         "id": 101,
         "name": "Ob2",
         "properties": {
             "attName": "B1",
             "attType": "string",
             "attOccurance": "minOccurs="1""
         },
     }
     "Ob3": {
          "id": 10001,
          "name": "Ob3",
          "properties": {
              "attName": "C1",
              "attType": "string",
              "attOccurance": "minOccurs="1""
              },
     }
}

Для этого вложенного в другой объект, но с данными плоского:

myObj = {
    "Ob1": {
        "myObjName": "A1",
        "myObjType": "string",
        "myObjOcc": "minOccurs="1""
        "Ob2": {
            "myObjName": "B1",
            "myObjType": "string",
            "myObjOcc": "minOccurs="1""
            "Ob3": {
                "myObjName": "C1",
                "myObjType": "string",
                "myObjOcc": "minOccurs="1""
            } 
        }
   }
}

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

for each(var obj in mainObj){
    switch (true) {
        case  obj.id < 100: levelId=1; break;
        case  obj.id < 10000: levelId=2; break;
        case  obj.id < 1000000: levelId=3; break;
        case  obj.id < 100000000: levelId=4; break;
    }
}

У меня есть только это, но я не знаю, как их вложить:

for (key in mainObj) {
    myObj.myObjName = mainObj[key].properties.attName,
    myObj.myObjTyp = mainObj[key].properties.attType,
    myObj.myObjOcc = mainObj[key].properties.attOccurance
}

Пожалуйста, если кто-нибудь может сказать мне, как я могу это сделать

1 Ответ

0 голосов
/ 21 ноября 2018

Учитывая ввод и вывод, это то, что я придумал.Посмотрите, поможет ли это.

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

const mainObj = {"Ob1": {    "id": 1,    "name": "Ob1",    "properties": {        "attName": "A1",        "attType": "string",        "attOccurance": "minOccurs='1'"    },},"Ob2": {     "id": 101,     "name": "Ob2",     "properties": {         "attName": "B1",         "attType": "string",         "attOccurance": "minOccurs='1'"     }, }, "Ob3": {      "id": 10001,      "name": "Ob3",      "properties": {          "attName": "C1",          "attType": "string",          "attOccurance": "minOccurs='1'"          }, }, "Ob4": {      "id": 202,      "name": "Ob4",      "properties": {          "attName": "D1",          "attType": "string",          "attOccurance": "minOccurs='1'"          }   }}

let levelKey = {}, newObj = {}

function getLevel(id) {
  let level = 1
  while(parseInt(id / 100) > 0) {
    level++
    id = id / 100
  }
  return level
}

function getLastLevel(id) {
  id--
  while(id > 0) {
    if(levelKey[id]) return id
    id--
  }
  return id
}

function getObj(str) {
  return str.split('.').reduce((o, d) => o[d], newObj)
}

for( let [k, v] of Object.entries(mainObj)) {
  let level = getLevel(v['id'])
  let obj = {
    myObjName: v.properties.attName,
    myObjType: v.properties.attType,
    myObjOcc: v.properties.attOccurance
  }

  let lastLevel = getLastLevel(level) || level
  levelKey[lastLevel]
    ? (getObj(levelKey[lastLevel])[k] = obj, levelKey[level] = levelKey[lastLevel] + '.' + k)
    : (newObj[k] = obj, levelKey[level] = k)
}

console.log(newObj)
...