当前位置:首页 » 《随便一记》 » 正文

JavaScript递归查询省市区数据_Script_ssq的博客

25 人参与  2021年12月15日 08:36  分类 : 《随便一记》  评论

点击全文阅读


因为在开发中需要用到省市区数据,但是后端只返回最里层城市的code值

频繁百度找不到很好的方法,很多都是写了好几个方法去调用,并且多次调用导致很难理解;

这里分享一下我根据自己的思路所完成的一个方法。

(方法未经过长久测试,会有未知bug,并且可能会在不同数据体下也会有误差!)

废话:

        在城市数据中我们知道,基本由以下三个字段构成:code、name、children

        code是省市区的唯一代码,name则是省市区的名称,children则是省市区下的子项。

       我们在只查找返回code对应的省市区的名称时很简单,普通的递归就可以实现;

        但是如果我们也想要去获取上一层的数据,该怎么拿呢?

思路:

        很简单,在递归中,除了第一层的循环,内循环均向下传入父级数据。

        第一层循环不传入是因为如果不打断,就会卡死循环。

        这个时候我们只能拿到两层数据,当前级和上一级。

        那如果还想往上查找,还记得我们传入的父级数据吗,父级的code就起到了作用

        重复调用递归方法,注意,此时调用必须传入源数据,也就是一开始的那一大串数据,这个时候调用查找到的就是父级的code和name

        方法会一直循环遍历查询,直到已经达到最外层。

        我们把我们所需要的数据用一个数组存放起来,并且return出去。

代码:

    /**
     * 根据code查询城市
     * 并查出所有父级
     * 原理 ===> 
     * 通过递归查找code与传入code相同
     * 且在查找相同code的同时,将上级内容传递进下级循环中
     * 如果code相同了,上级内容自然就能拿到
     * 因为不知道有多少个上级
     * 所以在查找到之后继续进行递归源数据(这里注意,并不是当前循环数据,而是最根本的数据)
     * 这个时候不需要传递当前级的内容,否则无限循环卡死
     */
    function getArea(json, code) {
        let names = [];
        let codes = [];
        function findCity(list, code, father) {
            const index = list.findIndex(ev => ev.code == code);
            if (index > -1) {
                const child = list[index];
                names.unshift(child.name);
                codes.unshift(child.code);
                father && names.unshift(father.name) && codes.unshift(father.code);
                father && findCity(json || [], father.code);
                return;
            }
            list.map(item => {
                if (item.children) {
                    findCity(item.children || [], code, item);
                }
            })
        }
        findCity(json, code);
        names = [...new Set(names)];
        codes = [...new Set(codes)];
        return { codes, names };
    }
    const list = getArea(cityJson, parseInt(code));
    console.log(list);


点击全文阅读


本文链接:http://zhangshiyu.com/post/31565.html

递归  数据  省市区  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 晚风轻吻夏夜萤火全书+后续(裴少舟陆闻迟)全书裴少舟陆闻迟结局_裴少舟陆闻迟+结局列表_笔趣阁(晚风轻吻夏夜萤火全书+后续)
  • 闻砚辞阮雾梨(人面桃花长相忆阮雾梨+结局+番外)_闻砚辞阮雾梨列表_笔趣阁(人面桃花长相忆阮雾梨+结局+番外)
  • [洪荒:先天阴阳蛟,再无金蛟剪]完结版全文_元易云霄爆款小说高能章节试读
  • 月下无花已成憾命运转折章节速览_[李培佳如烟穆晓]小说无删减版在线阅读
  • 二十八次背叛小说精彩章节试读_[顾寒冉冉顾笙]完本
  • [这情天恨海,谁同君天上人间]后续完整大结局_「玄翊黄泉寿元」完结
  • 阮雾梨闻砚辞精彩分享_阮雾梨闻砚辞精彩分享
  • 半是风雨半是霜+结局+番外(顾宴辞宋相欢)_(顾宴辞宋相欢)半是风雨半是霜+结局+番外
  • 张静周明苏梦(被白眼狼养女谋财害命后我杀疯了结局+后续全面完结)免费在线_(被白眼狼养女谋财害命后我杀疯了结局+后续全面完结)张静周明苏梦免费精彩片段
  • 我不是御兽之王,别抢着当我的契约兽!独家章节限时试读_「罗小武」小说精彩节选免费试读
  • [女儿参加变形节目导致我被全网网暴后,我杀疯了]悬念章节免费释出_[小雨杨丽祖宗]小说精彩章节免费试读
  • (番外)+(全书)羽樱黎墨(往劫覆烟萝结局+番外)全书在线_羽樱黎墨免费列表_笔趣阁(往劫覆烟萝结局+番外)

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1