最近在实习工作中遇到了一个需要问题:将后台返回的省市区 json 数据格式化以便前端渲染。这个问题真的是缠绕了我好几天,有思路但是思路特别模糊,今天终于解决了。

返回的数据格式如下:

[
{
"children": [
{
"children": [
"东城区",
"西城区",
...
],
"name": "北京市"
}
],
"name": "北京市"
},
{
"children": [
{
"children": [
"西湖区",
"余杭区",
...
],
"name": "杭州市"
}
],
"name": "浙江省"
},...]

我只需要第一级和第二级的 name 数据值,可以使用递归函数来查找,具体看下面的代码:

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.12.4/jquery.js"></script>
<script> // 使用ajax获取数据
function dataFormatterTypeId() {
let json
$.ajax({
url:"administrative-divisions.json",
type:"get",
dataType:"json",
async: false,
success:function(result){
// console.log(result)
json = result
}
})
return json
} let res = dataFormatterTypeId()
// console.log(res) // 核心代码----------------递归实现
function getJson (json) {
for (let i = 0; i < json.length; i++) {
if (json[i].children && typeof json[i].children[0] === "object") {
this.getJson(json[i].children)
} else {
json[i].children = undefined
}
}
return json
}
console.log(this.getJson(res))

这里主要的思路是用递归函数实现:使用递归函数设置最后一级 children 的值为undefined 然后返回数据即可。

然而,主要的问题是 终止递归的时机在哪里?我也知道可以通过判断 children 里面的数据部位 Object 类型的时候就可以终止递归,但是,我把最关键的代码写成了 typeof json[i].children[0] === Object,...

好吧,最基础的知识点:typeof 的取值有 "number"、"string"、"boolean"、"object"、"function" 和 "undefined",注意是字符串

而今天可能脑子比较清醒,突然想到使用typeof打印以下结果是啥,结果就解决了。

此外,在本地测试,通过jquery ajax 模拟获取数据并返回给全局使用,就是dataFormatterTypeId()函数所作的事情。

最新文章

  1. Win10 UWP系列:关于错误 0x80073CF9及一个小bug的解决
  2. [转]Oracle数据块体系的详细介绍
  3. 《Java程序设计》第二周学习总结
  4. [About me] 关于Alima博主
  5. 【转】unity3d input输入
  6. mybatis3-generator-plugin插件地址
  7. 区分width()、css(&#39;width&#39;)、innerWidth()
  8. Ajax 获取数据代码
  9. Java调用本地接口
  10. mysql 多列索引的生效规则
  11. centos/linux下的安装Tomcat
  12. django-crontab实现定时任务
  13. VS2010与Matlab2010b混合编程
  14. css3 - 纯css实现一个轮播图
  15. 自学工业控制网络之路1.1-工业控制系统发展历程CCS DCS FCS
  16. pycharm 配置使用
  17. CompletableFuture 专题
  18. 编程使用缓冲流读取试题文件,test6_5.txt 内容如下所示。 每次显示试题文件中的一道题目,读取到字符“*”时暂停读取, 等待用户从键盘输入答案。用户做完全部题目后,程序给出用户的得分。
  19. Ubuntu 14.04环境变量修改
  20. 关于MySQL数据库

热门文章

  1. 虹软人脸识别 - faceId及IR活体检测的介绍
  2. 阿里巴巴--java多线程的两种实现方式,以及二者的区别
  3. vue 组件传参及跨域传参
  4. 如何修改linux下tomcat指定的jdk路径
  5. linux就该这么学 第一天学习笔记
  6. RSS阅读器推荐
  7. 命令 关闭SElinux
  8. 利用Chrome浏览器调试线上代码
  9. LeetCode 81,在不满足二分的数组内使用二分法 II
  10. web前端开发_文件/目录/样式/函数等命名规范