node.js - 如何在节点js递归函数中的for / in函数完成时返回
问题描述
我在 node.js 中迭代一个嵌套的 json,如下所示,并且想要获取所有attrList
类型为 abc 的位置并创建另一个 json。
我能够提取所需的数据并创建输出 json。
但是我应该如何返回最终的输出数组?我无法弄清楚退出/返回条件。我是node js的新手,还在学习。有人可以在这里帮忙吗?
function recursion(input, output) {
if (input["Type"] == "abc") {
let attrlist = {};
for (let i = 0; i < input["atrrlist"].length; i++) {
attrlist[input["atrrlist"][i]["name"]] = input["atrrlist"][i]["val"];
}
if (input["atrrlist"].length > 0) {
output[input["a"]] = attrlist;
}
}
for (let obj in input) {
if (typeof input[obj] == "object" && input[obj] !== null) {
recursion(input[obj], output);
}
}
}
我这样称呼它。
let output={};
recursion(input, output)
输入json如下:
{
"a": "val",
"b": "val2",
"Type": "abc",
atrrlist": [{
"name": "vbv",
"val": "vbv"
}],
"child": [{
"a": "val",
"b2": "val2",
"Type": "abc",
"atrrlist": [{
"name": "vbv",
"val": "vbv"
}],
"child": [{
"a": "val",
"b2": "val2",
"Type": "abc",
"atrrlist": [{
"name": "vbv",
"val": "vbv"
}],
"child": [{
"a": "val",
"b2": "val2",
"Type": "xyz",
"atrrlist": [{
"name": "vbv",
"val": "vbv"
}]
}]
}]
}]
}
解决方案
您没有指定预期的输出结构,只是它是一个数组。
我建议不要output
作为参数传递,而是将其作为函数的返回值recursion
。您的代码中的主要问题是您没有将递归结果连接到“当前”结果。当您编写“我应该如何返回最终输出数组?”时,您定义output
它的唯一一次不是数组。. 所以将它定义为一个数组并将结果推送给它,还有递归的。
function recursion(input) {
const output = [];
if (input.Type === "abc") {
const attrlist = {};
for (const {name, val} of input.atrrlist) {
attrlist[name] = val;
}
if (input.atrrlist.length > 0) {
output.push({ [input.a]: attrlist });
}
}
for (const obj of Object.values(input)) {
if (Object(obj) === obj) {
output.push(...recursion(obj));
}
}
return output;
}
// Sample input:
const input = {"a": "val","b": "val2","Type": "abc","atrrlist": [{"name": "category","val": "furniture"}],"child": [{"a": "val","b2": "val2","Type": "abc","atrrlist": [{"name": "product","val": "chair"}],"child": [{"a": "val","b2": "val2","Type": "abc","atrrlist": [{"name": "color","val": "blue"}],"child": [{"a": "val","b2": "val2","Type": "xyz","atrrlist": [{"name": "vbv","val": "vbv"}]}]}]}]};
console.log(recursion(input));
推荐阅读
- c++ - 我正在尝试排梯队减少代码(不是减少排梯队)我有一个工作代码,但我正在尝试清理 for 循环
- flutter - 未调用 GetxController onClose
- service - 如果教程在 AWS 上并且我当前的帐户在 Azure 上,我是否需要两个帐户?我可以更改我的云服务提供商吗?
- amazon-web-services - 我可以在 CodeBuild 服务角色中使用 aws:PrincipalTag 或 aws:ResourceTag 吗?
- flask - 多重排序,当一个值是优先选项(高、中、低)时?
- python - 如何在新窗口中从 .py 文件调用另一个 python 脚本
- migration - 用松露迁移合同让我恢复交易
- java - Maven 执行不适用于 TestNG.xml
- linux - 为什么两个不同系统之间的 apache2 中每个进程使用的内存差异如此之大?
- c - linux,系统调用do_execv vs execv?