Javascript用递归的方式遍历json数组-阿里云开发者社区

开发者社区> 天降风云> 正文

Javascript用递归的方式遍历json数组

简介: 前言 Javscript语言有很多值得探究和注意的地方,下面我们来看一下用递归的方式遍历JSON对象数组。
+关注继续查看

前言

Javscript语言有很多值得探究和注意的地方,下面我们来看一下用递归的方式遍历JSON对象数组。

正文

假设我们的要遍历的数组是这样的:

var array = [
            {
                id: 1,
                children:[{
                        id:2,
                        children:[]
                    }]
            },

            {
                id:3,
                children:[]
            },

            {
                id:4,
                children:[
                    {
                        id:5,
                        children:[
                            {
                                id:6,
                                children:[]
                            },

                            {
                                id:7,
                                children:[]
                            }
                        ]
                    }
                ]
            }
        ];

这是一个数组,假如我们想找出id为7的对象,可以用如下的函数:

        var find = function(arr, id){
            arr.forEach((item) => { 
                 if(item.id==id)
                 {        
                     return item;
                 }
                 else if(item.children.length > 0)
                 {
                     find(item.children, id);                        
                 }                   
            })
        }
        var item = find(array, 7);
        console.log(item);

看起来没什么问题,只是简单的递归,但是最后得到的输出却是undefined。这是因为函数里的return语句,所返回的其实是arr.forEach这个匿名函数的返回值,而我们所调用的find函数实际上却没有返回值,所以当我们输出item的时候会得到undefined。这里的解决方法是,在函数外面定义一个变量,然后在函数语句中return之前,把找到的对象赋给这个变量:

        var returnedItem;

        var find = function(arr, id){
            arr.forEach((item) => { 
                 if(item.id==id)
                 {        
                     returnedItem = item;
                     return item;
                 }
                 else if(item.children.length > 0)
                 {
                     find(item.children, id);                        
                 }                   
            })
        }

        var item = find(array, 7);
        console.log(returnedItem);

修改后的输出为


这里写图片描述

这样一切就正常了。

结尾

出现这样的情况主要还是因为javascript对于return这个关键字的处理和java语言稍有不同。在上面的修改后的代码中,其实完全省略掉return语句,因为每个对象的id是唯一的,returnedItem在被赋值以后也不会再变化。这里的return只是起到了一个跳出循环的作用,在遍历量很大的时候可以保留下来,这样在我们遍历到想要的item之后可以让程序省去遍历剩余数组的步骤,提高效率。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9701 0
JavaScript类创建的几种方式
/*******************JavaScript默认规则*********** 1.类名首字符大写 2.方法名首字符小写 3.属性首字符大写 4.字段全小写 5.常量全大写 ***********************************************/ ...
730 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10862 0
javascript中创建对象的几种方式
原文:javascript中创建对象的几种方式 javascript中提供了通过Object构造函数或对象字面量方式来创建单个的对象,当我们想要创建很多对象的时候,简单的通过这两种方法就会产生大量的重复。
958 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13414 0
Javascript中四种函数调用方式
为了解释方便,先创建一个函数: function showmsg(){ console.log(this);} 它的作用是打印this这个对象,也方便我们了解它到底指代什么。
565 0
JavaScript中样式,方法 函数的应用
JavaScript中一个字母都不能错,编写的时候他不报错,也不提示,只有在执行的时候才会提示错误位置 。 一.样式
528 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
7094 0
+关注
天降风云
java,前端,算法相关技术专家
16
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载