从JSON递归创建对象

3

我需要从一个JSON文件创建一个对象。 输入的JSON文件的格式如下。

{  
   "test":{
      "Record":1,
      "RecordValues":{  
         "Address":"3330 Bay Rd.",
         "City":"Los Angeles",
         "SecondObject":{  
            "1":"eins",
            "2":"zwei"
         }
      }
   }
}

我所做的是这个函数...
var test = [];
function recFunc(obj, parent_id = null) {

    for(var i in obj) {
        if(typeof obj[i] == "object" && obj[i] !== null) {
            test.push({title: i, children: []});
            recFunc(obj[i], (test.length-1));
        }else {
            if(parent_id != null) {
                test[parent_id].children.push({title: (i + " : " + obj[i])});
            }else {
                test.push({title: (i + " : " + obj[i])});
            }
        }
    }
    return test;
}

输出对象应如下所示。
[  
   { "title":"Record : 1" },
   {  
      "title":"RecordValues",
      "children":[  
         { "title":"Address : 3330 Bay Rd." },
         { "title":"City : Los Angeles" },
         {  
            "title":"SecondObject",
            "children":[  
               { "title":"1 : eins" },
               { "title":"2 : zwei" }
            ]
         }
      ]
   }
]


1
那个目标对象看起来设计得非常糟糕。你能解释一下为什么需要它吗? - trincot
@trincot 需要目标对象来使用 JavaScript 插件 fancytree。 - Vinnecent
3个回答

1
这里有一种可能的方法,通过递归迭代Object.entries:

const input = {
  "test": {
    "Record": 1,
    "RecordValues": {
      "Address": "3330 Bay Rd.",
      "City": "Los Angeles",
      "SecondObject": {
        "1": "eins",
        "2": "zwei"
      }
    }
  }
};

const makeNested = (currInput) => {
  return Object.entries(currInput).map(([key, val]) => (
      typeof val !== 'object'
      ? { title: `${key} : ${val}` }
      : {
          title: key,
          children: makeNested(val)
        }
  ))
};
console.log(makeNested(input.test));


我回家后会尝试一下。非常感谢 :) - Vinnecent

1
你可以使用 Object.entries(),并在嵌套值是对象的情况下递归调用该函数:
Object(value) === value 检查 value 是否为非 null 的对象)

const obj = {test:{Record:1,RecordValues:{Address:"3330 Bay Rd.",City:"Los Angeles",SecondObject:{1:"eins",2:"zwei"}}}};

function transform(obj) {
  return Object.entries(obj).map(([key, value]) => {
    if(Object(value) === value)
      return { title: key, children: transform(value) }
     else
      return { title: `${key} ${value}` }
  })
}

console.log(transform(obj.test))


你到达这里的速度更快了 +1 - Code Maniac
我在玩reduce,哈哈,我需要更多地练习递归 :) - Code Maniac

1
你可以使用Object.entriesreduce来进行递归。

let obj = {"test":{"Record":1,"RecordValues":{"Address":"3330 Bay Rd.","City":"Los Angeles","SecondObject":{"1":"eins","2":"zwei"}}}}

let recursive = (obj) =>
  Object.entries(obj).reduce((op,[key,value]) => {
  let final = typeof value === 'object' ? {title:key, children:recursive(value)} 
                                        : {title: `${key}: ${value}`}
  return op.concat(final)
},[])


console.log(recursive(obj.test))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接