打字稿中的JSON转换

时间:2018-10-18 12:21:28

标签: json angular typescript recursion

我是这类新手。我有这样更大的JSON:

{ "X": {
            "child1": {
                "k1": [],
                "k2": "12",
                "k3": "abc" 
            },
            "ver": {
                "dev1": {
                    "key1": "0x0100" 
                },
                "dev2": {
                    "key1": "0x0003",
                    "key2": "0x0300" 
                },
                "dev3": {
                    "key1": "0x990",
                    "key3": "0x0400",
                    "key2": "0x0100" 
                }}}}

由于我需要使用角树组件,因此需要将上面的格式转换为类似这样的格式:

{name:X, children: [{name: child1, children: [{name: k1, children: [{name: []}]}]....

我的问题是如何遍历整个json进行此转换?应该可以通过递归来实现,但是我从未尝试过。

我尝试递归:

recursive(obj) {
  if (obj instanceof String) {
    return {name: obj};
  } else if (obj instanceof Array) {
    const arr = [];
    obj.forEach(item => {
      arr.push({name: item})
      return arr;
    });
  } else {
    Object.keys(item => {
      return this.recursive(obj[item]);
    });
  }
}

1 个答案:

答案 0 :(得分:1)

您已经接近了,但是您需要确保从recursive函数的每种情况返回一些内容。从回调返回值不会从主函数返回。另外,Object.keys仅返回键数组;如果要遍历它们,则必须单独进行。这是我建议的解决方案:

recursive(name, obj) {
  if (typeof obj === "string") {
    return { name: name + ": " + obj };
  } else if (obj instanceof Array) {
    return { name: name, children: obj.map(item => this.recursive("", item)) };
  } else {
    return { name: name, children: Object.keys(obj).map(k => this.recursive(k, obj[k])) };
  }
}

您可以根据需要调整名称的处理方式。