我目前正在处理一个问题,写一个recrusive函数来订购一些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,i);
        }
    }

}

}

catalog.init();

这输出:

但是,而不是在格式下检索我的第三张幻灯片的数据:

A-A-A

A-B-A

A-C-一个

我想得到

一个-α-[A,B,C]

我想知道这是否可能,因为我不擅长处理递归过程.我希望我很清楚,谢谢你阅读本文.
我基本上需要保留原始数据结构,但删除每次迭代的第一个深度级别(滑块中的滑动表示我的数据结构中的深度增加).

解决方法

我最近编写了一个算法来递归处理这样的数据.这是一个 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]

希望这可以帮助!!!

javascript – 订购递归函数会导致数组数组的更多相关文章

  1. ios – 嵌套递归函数

    我试图做一个嵌套递归函数,但是当我编译时,编译器崩溃.这是我的代码:编译器记录arehere解决方法有趣的…它似乎也许在尝试在定义之前捕获到内部的引用时,它是bailing?以下修复它为我们:当然没有嵌套,我们根本没有任何问题,例如以下工作完全如预期:我会说:报告!

  2. 由于未编译着色器,Unity应用程序在iOS上崩溃

    我正在尝试为iOS构建我的Unity5.4.2f2应用程序.它没有编译错误.但是当我尝试使用Xcode8.0运行应用程序时,它立即崩溃,调试器报告以下错误.Failedcompiling:fragmentevaluationshaderWARNING:0:4:extension‘GL_EXT_frag_depth’isnotsupportedERROR:0:38:Useofundeclaredid

  3. swift override --有一个递归问题未解决

    classca{varcount:Int{get{return1;}set{self.count=newValue;}}funcdescribe()->String{return"ca";}}classcb:ca{overridefuncdescribe()->String{return"cb";}overridevarcount:Int{get{return2;}set{//引起了递归调用,未找

  4. Swift2.0语言教程之函数嵌套调用形式

    Swift2.0语言教程之函数嵌套调用形式Swift2.0语言函数嵌套调用形式在Swift中,在函数中还可以调用函数,从而形成嵌套调用。以下将对这两种调用进行详细讲解。调用方式如图7.4所示。图7.4函数嵌套的形式以下将使用函数的嵌套调用实现对s=22!这个数值,即调用f1()函数,计算22,结果为4,然后在调用f2()函数,对4的阶乘求取,计算完成22!但是在Swift语言中递归必须要有一个满足结束的条件。

  5. swift实现单例模式

    单例模式单例模式有三个要点:1.只有一个实例2.构造函数要私有3.构造过程线程安全实现swift的static构造过程中使用了dispatch_once方法,使得只会构造一次。

  6. swift - The Adapter Pattern

    ThispatternallowstwoobjectsthatproviderelatedfunctionalitytoworktogetherevenwhentheyhaveincompatibleAPIs.Diagram:client:letsearch=SearchTool(dataSources:SalesDataSource(),DevelopmentDataSource());prin

  7. 【Swift】学习笔记(九)——枚举

    因为类完全可以替代枚举。不过swift中也有许多类的特性被枚举支持。这样判断必须穷举所有成员,否则就需要增加default这个选项了。使用递归枚举时,编译器会插入一个中间层。

  8. Swift实现的快速排序及sorted方法的对比

    Swift语言有着优秀的函数式编程能力,面试的时候面试官都喜欢问我们快速排序,那么用Swift如何实现一个快速排序呢?然后实现快速排序的方法:可以发现使用Swift实现快速排序的代码非常的简洁。在看完这段代码后我做了如下思考:既然是排序,那么必然可以使用系统的sorted方法,效果如何呢?对于快排最头疼的顺序性数组,sorted的重复次数只有n次!说明在面对这种类型的数组的时候sorted方法进行过判断,直接输出了。

  9. 《swift2.0 官方教程中文版》 第2章-08枚举

    importFoundation//在Swift中,枚举类型是一等公民。像Swift中其他类型一样,它们的名字必须以一个大写字母开头。给枚举类型起一个单数名字而不是复数名字,以便于读起来更加容易理解:vardirectionToHead=Compasspoint.West//directionToHead的类型可以在它被Compasspoint的一个可能值初始化时推断出来。//使用枚举成员的rawValue属性可以访问该枚举成员的原始值:letearthsOrder=Planet2.Earth.rawVa

  10. swift枚举

    Swift中的枚举更加灵活,不必给每一个枚举成员提供一个值。它是Directionoperation类型,因为swift中的枚举不会自动给成员赋值为0,1…枚举类型易扩展。原始值的隐式赋值在使用原始值为整数或者字符串类型的枚举时,不需要显式地为每一个枚举成员设置原始值,Swift将会自动为你赋值。

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部