首页 > 解决方案 > 如何在节点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"
            }]

        }]

    }]
}]

 }

标签: node.jsjsonrecursion

解决方案


您没有指定预期的输出结构,只是它是一个数组。

我建议不要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));


推荐阅读