javascript - 从平面对象结构创建嵌套对象结构

标签 javascript object nested structure

如果有人可以告诉我,我该如何利用这个平面对象结构:

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""
            } 
        }
   }
}

嵌套逻辑是,如果下一个对象的 id 比前一个对象大,那么它就是它的子对象。 这是逻辑:

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
}

请问有人可以告诉我该怎么做吗?

最佳答案

鉴于输入和输出,这就是我想出的。看看是否有帮助。

虽然有很多情况我认为我不确定输出应该是什么。

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)

关于javascript - 从平面对象结构创建嵌套对象结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53408641/

相关文章:

javascript - 使用 jQuery 在 Object 元素的属性中设置值?

javascript - 如何从包含字符串、对象和数组的 Javascript 对象中检索动态指定的、任意的和深度嵌套的值?

javascript - 按键检索嵌套对象

r - 如何防止嵌套 foreach 循环使用 R 中所有核心的 100% CPU?

javascript - Vue.js axios 从本地存储(localforage)获取值返回promise对象而不是值

javascript - 不支持视频格式或 MIME 类型

javascript - 使用 javascript 变量代替 json 文件

javascript - jQuery - 选中的复选框值(链接 jQuery 函数与 If 语句)

C++ 类变量不会保留从另一个类传递的二维对象数组的值

javascript - 从元素创建 map 对象 JavaScript 添加或删除值