将递归函数结果按顺序排列为数组的数组

7

我目前在编写一个递归函数来对一些json数据进行排序的问题上遇到了困难。我有几个嵌套的对象数组需要排序,以形成单个幻灯片。结构类似以下:

[
{
    "title": "a",
    "children": [
        {
            "title": "a-a",
            "children": [
                {
                    "title": "a-a-a"
                },
                {
                    "title": "a-a-b"
                }
            ]
        },
        {
            "title": "a-b",
            "children": [
                {
                    "title": "a-b-a"
                },
                {
                    "title": "a-b-b"
                }
            ]
        }
    ]
},
{
    "title": "b",
    "children": [
        {
            "title": "b-a",
            "children": [
                {
                    "title": "b-a-a"
                },
                {
                    "title": "b-a-b"
                }
            ]
        },
        {
            "title": "b-b",
            "children": [
                {
                    "title": "b-b-a"
                },
                {
                    "title": "b-b-b"
                }
            ]
        }
    ]
}
]

我写了一个递归函数:

var catalog = {

init: function() {

    var _this = this;

    $.getJSON("catalog.json", function(data) {

        _this.slides = [];
        _this.parseCategories(data.catalog.category,-1,0);

    });

},

parseCategories: function(array, depth, prevParent) {
    ++depth;

    if (!this.slides[depth]) this.slides[depth] = [];
    if (!this.slides[depth][prevParent]) this.slides[depth][prevParent] = [];

    this.slides[depth][prevParent].push(array);

    for (var i = 0; i < array.length; i++) {

        if (array[i].category) {

            this.parseCategories(array[i].category, depth, i);
        }
    }

}

}

catalog.init();

这将输出:

输入图像描述

然而,我想在我的第三张幻灯片下获取格式为“a-a-a”,“a-b-a”和“a-c-a”的数据,我希望获取格式为“a-a-[a,b,c]” 的数据。由于我不太擅长处理递归过程,我想知道这是否可能。希望我表述清楚了,谢谢您的阅读。 基本上,我需要保留原始数据结构,但在每次迭代(滑块中表示数据结构递增深度)时删除第一层深度级别。

我不确定我完全理解你的问题。虽然我最近解决了一个类似的问题,也许那个答案可以帮到你。如果不能,请看看能否澄清问题——顶部预期输出的图像很有用,类似于这样的东西与你的实际结果会有所帮助。 - Dave
谢谢您的回答,不幸的是我认为我的问题可能会稍微复杂一些。我已经在我的帖子中编辑了一个新的图像,展示了我的函数返回的输出和我实际需要的输出。我的想法是,我需要通过handlebars模板构建一个滑块,并在隐藏所有不必要的数据的同时在子级和父级之间导航。因此,我的输出必须以每个深度的数组形式返回数据,并在深度增加时在数组中结构化每个子类别。我可以使用几个循环,但我担心性能成本。 - J Dubuis
6
请提供您真正的 JSON 结构。您当前的 JSON 结构与图片示例不符。如果可能,请提供一个 jsfiddle,展示您已经完成的内容。 - Fabio Luz
same request as @FabioLuz - Mark Hill
请为给定对象提供所需的顺序。 - Nina Scholz
你尝试的递归方式是不可能的(除非你制作一些奇怪的if语句来检查深度,但这样做递归的意义何在)。无法实现的原因是因为你想要在处理完成后更改深度1的输出结构。只有在创建最后一个深度之前,你才能生成最后一个图像。 - Bas van Stein
1个回答

0

我最近编写了一个递归处理这类数据的算法。这里是 jsfiddle 和主要函数

console.log('starting');
// data in tree format.
var output = {};
// data in slide format ["a-a-a", "a-a-b", "b-b-a", "b-b-b"]
var outputStrs = [];
parseData(data, output);
console.log(output);
console.log(outputStrs);

function parseData(data, store) {
    // go through each element 
    for (var i = 0; i < data.length; i++) {
        var element = data[i];
        // used to keep track of where we are in the tree.
        var splitElement = element.title.split('-'); 
        var titleStart = splitElement[0];
        // console.log(element);
        if (_.has(element, 'children') && _.isArray(element.children)) {
            // if there is a children, then recursively handle it. 
            store[titleStart] = {};
            parseData(element.children, store[titleStart]);
        } else {
            // if we are at the end, then add in the data differently. 
            var titleEnd = splitElement[splitElement.length-1];
            store[titleEnd] = titleEnd;
            // create the slides 
            var slide = [];
            for (var j = 0; j < splitElement.length; j++) {
                if (j !== splitElement.length - 1) {
                    slide.push(titleStart); 
                } else {
                    slide.push(titleEnd); 
                }
            }
            slide = slide.join('-');
            if (!_.contains(outputStrs, slide)) outputStrs.push(slide);
        }
    }
}

有了这些数据,输出应该类似于

a
    a
        a
        b
b
    b
        a
        b

而 outputStrs 将类似于 a-a-[a,b,c]

希望这可以帮到你!!!


非常感谢,事实上我已经简化了整个系统以适应我的需求(在DOM中添加一个标记而不是试图完美地格式化数组),但这可能符合我的先前需求。 - J Dubuis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接