Json数据修改为新的键值对JavaScript

问题描述 投票:0回答:1

我有一个要重新格式化为新的键值对的json数据。我正在使用以下JavaScript代码来格式化json数据。

const input = {
    "file1": {
        "function1": {
            "calls": {
                "405:4": {
                "file": "file1",
                "function": "function2"
                },
                "406:4": {
                    "file": "file1",
                    "function": "function3"
                }
            }
        },
        "function2": {
            "calls": {
                "397:7": {
                    "file": "file2",
                    "function": "function1"
                }
            }
        },
        "function3": {
            "calls": null
        },
        "function4": {
            "calls": null
        }
    },
    "file2": {
        "function5": {
            "calls": {
                "43:4": {
                    "file": "file2",
                    "function": "function5"
                }
            }
        },
        "function6": {
            "calls": {
                "32:4": {
                    "file": "file1",
                    "function": "function1"
                }
            }
        }
    }
}
function transformData(data) {
    let  res = [];
    let calls = [];
    Object.entries(data).map(([fileName, fileObject]) => {
        Object.entries(fileObject).map(([functionName, functionObject]) => {
            Object.entries(functionObject).map(([functionKey, functionValue]) => {
                if(functionKey === "calls") {
                    Object.entries(functionValue).map(([callKey, callObject]) => {
                        calls = [...calls, callObject['file']+"."+callObject['function']]
                    });
                } 
            });
            res = [...res,{"name": fileName+"."+functionName, "import": calls}]  
        });
    });
    return res;
}
const sanitize = (obj) => {
    return JSON.parse(JSON.stringify(obj, (key, value) => {
        return (value === null ? undefined : value);
    }));
};
const data = sanitize(input)
const result = transformData(data);
console.log(result)

我预期的json数据如下:

[
  {
    "name": "file1.function1",
    "imports": [
      "file1.function2",
      "file1.function3"
    ]
  },
  {
    "name": "file1.function2",
    "imports": [
      "file2.function1"
    ]
  },
  {
    "name": "file1.function3",
    "imports": []
  },
  {
    "name": "file1.function4",
    "imports": []
  },
  {
    "name": "file2.function5",
    "imports": [
      "file2.function5"
    ]
  },
  {
    "name": "file2.function6",
    "imports": [
      "file1.function1"
    ]
  }
]

我的输出不正确。尽管它使用名称和导入键给出了正确数量的主数组,但是导入数组是错误的。

有人可以帮我吗。我认为我没有以正确的方式退还它。

javascript arrays json
1个回答
0
投票

您做的错误是,您每次都将相同的calls数组分配给import,并且没有在后续迭代中清除过去的元素。替换为该代码以获得预期的结果。

function transformData(data) {
    let res = [];
    Object.entries(data).map(([fileName, fileObject]) => {
        Object.entries(fileObject).map(([functionName, functionObject]) => {
            let calls = []; // Notice this line. I'm creating new array for every iteration. Another way is to clear the array before proceeding.
            Object.entries(functionObject).map(([functionKey, functionValue]) => {
                if(functionKey === "calls") {
                    Object.entries(functionValue).map(([callKey, callObject]) => {
                        calls = [...calls, callObject['file']+"."+callObject['function']]
                    });
                } 
            });
            res = [...res,{"name": fileName+"."+functionName, "import": calls}]  
        });
    });
    return res;
}
© www.soinside.com 2019 - 2024. All rights reserved.