zictos
2023-02-11 17:19:55 +08:00
chatgpt 的答案能参考吗?
推荐使用 jsonc-parser 库,它可以解析带注释的 JSON ,然后根据需要更新 JSON 对象并生成新的 JSON string 。下面是一个示例代码,可以实现题目要求的功能:
const { parseTree, findNodeAtLocation, applyEdits, modify } = require("jsonc-parser");
function updatePackage(jsonStr, packageName, packageData) {
const ast = parseTree(jsonStr);
const subpackagesNode = findNodeAtLocation(ast, ["subpackages"]);
const packageIndex = subpackagesNode.children.findIndex(
(child) => findNodeAtLocation(child, ["value", "name"]).value === packageName
);
if (packageIndex !== -1) {
const packageNode = subpackagesNode.children[packageIndex];
const edits = modify(jsonStr, packageNode.offset, packageNode.length, JSON.stringify(packageData));
return applyEdits(jsonStr, edits);
} else {
const edits = modify(jsonStr, subpackagesNode.offset + subpackagesNode.length - 1, 0, `,${JSON.stringify(packageData)}`);
return applyEdits(jsonStr, edits);
}
}
const jsonStr = `{
"pages": ["pages/index/index"],
"subpackages": [
{
"name": "A",
"pages": ["innerModule/pages/index/index"]
},
{
"name": "B",
"pages": ["innerModule/pages/index/index"]
}
]
}`;
console.log(updatePackage(jsonStr, "C", { name: "C", pages: ["pages/C/index"] }));
在上面的代码中,updatePackage 函数接收一个 JSON string 、需要更新的包名和包数据。它首先使用 jsonc-parser 解析 JSON string ,然后在 AST 中查找 subpackages 节点。然后它在 subpackages 的子节点中查找与给定包名匹配的节点,如果找到了就将它替换为给定的包数据,否则就将包数据添加到 subpackages 的末尾。最后,它将生成的新 JSON string 返回。
由于使用 jsonc-parser 解析 JSON string 时可以保留格式信息,因此在 CI 中就不会产生额外的 diff 了。