首页 > 解决方案 > 打字稿中的 JSON 转换

问题描述

我是这类东西的新手。我有更大的 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]);
    });
  }
}

标签: jsonangulartypescriptrecursion

解决方案


你很接近,但你需要确保从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])) };
  }
}

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


推荐阅读