递归遍历对象以创建父子关系

时间:2017-08-21 22:28:11

标签: javascript json recursion

我一直在努力根据我在这里获得的帮助制作一个递归函数:looping through an object (tree) recursively

我想要浏览对象o并创建一个键在每个键上的新对象,并且对于它上面的所有内容都有父值。

我的大脑不会很好地递归,对它进行一次破解:-) ..如果你想尝试使用真实的数据here

function eachRecursive(obj) {
    for (var k in obj) {
        if (typeof obj[k] == "object" && obj[k] !== null ) {
            eachRecursive(obj[k])
        }
        else {
            // do something to add to codes
        }
    }
}

var o = {
    "1": {
        name: "hi 1",
        children: {
            "1.1": {
                name: "hi 1.1",
                children: {
                    "1.1.1": {
                        name: "hi 1.1.1",
                        children: {}
                    }
                }
            },
            "1.2": {
                name: "hi 1.2",
                children: {}
            }
        }
    },
    "2": {
        name: "hi 2",
        children: {
            "2.1": {
                name: "hi 2.1",
                children: {}
            }
        }
    }
}

var codes = {}
eachRecursive(o)
console.log(codes)
// What I wish to have.
//{
//    "1": {
//        "name":"hi 1",
//        "parents":[]
//    },
//    "2": {
//        "name": "hi 2",
//        "parents": []
//    },
//    "1.1": {
//        "name": "hi 1.1",
//        "parents": ["1"]
//    },
//    "1.1.1": {
//        "name": "hi 1.1.1",
//        "parents": ["1", "1.1"]
//    },
//    "1.2": {
//        "name": "hi 1.2",
//        "parents": ["1"]
//    },
//    "2.1": {
//        "name": "hi 2.1",
//        "parents": ["2"]
//    }
//}

2 个答案:

答案 0 :(得分:1)

你可以这样做:



function eachRecursive(obj) {
    return (function recurse(result, obj, parents) {
        for (var key in obj || {}) {
            result[key] = { name: obj[key].name, parents: [...parents] };
            recurse(result, obj[key].children, parents.concat(key));
        }
        return result;
    })({}, obj, []);
}


var o = {
    "1": {
        name: "hi 1",
        children: {
            "1.1": {
                name: "hi 1.1",
                children: {
                    "1.1.1": {
                        name: "hi 1.1.1",
                        children: {}
                    }
                }
            },
            "1.2": {
                name: "hi 1.2",
                children: {}
            }
        }
    },
    "2": {
        name: "hi 2",
        children: {
            "2.1": {
                name: "hi 2.1",
                children: {}
            }
        }
    }
}

var codes = eachRecursive(o);
console.log(codes);

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 1 :(得分:1)

你必须一步一步地思考如何手工完成。

  1. 如果它是一个对象:将实际节点添加到结果中,然后使用扩展父节点和结果再次调用该函数。

  2. 如果它不是对象:只需将其附加到结果中。

  3. 我在这里为你创造了一个小提琴:https://jsfiddle.net/11e8e4af/

    function eachRecursive(obj) {
      var parents = arguments[1] || [];
      var result = arguments[2] || {};
      for (var k in obj) {
        if (obj.hasOwnProperty(k) && typeof obj[k] == "object" && obj[k] !== null ) {
          result[k] = {name:obj[k].name, parents:parents.slice()};
          eachRecursive(obj[k].children, parents.concat(k), result);
        } else {
          result[k] = {name:obj[k].name, parents:parents.slice()};
        }
      }
      return result;
    }