如何将省市区树状结构数据扁平化处理?

如何将省市区树状结构数据扁平化处理?

将省市区树状数据转换为扁平结构

本文介绍如何将三级树状结构的省市区数据扁平化。原始数据采用树形结构,每个节点包含代码 (code)、名称 (value) 和选中状态 (checked)。目标是根据选中状态生成一个扁平数组,包含省份、城市和区县的代码及层级信息。

原始数据结构示例:

[  {    "code": "110000",    "value": "北京市",    "checked": "1",    "children": [      {        "code": "110100",        "value": "北京市",        "checked": "1",        "children": [          {"code": "110101", "value": "东城区", "checked": "1"},          {"code": "110102", "value": "西城区", "checked": "1"}        ]      }    ]  },  {    "code": "120000",    "value": "天津市",    "checked": "1",    "children": [      {        "code": "120100",        "value": "天津市",        "checked": "1",        "children": [          {"code": "120101", "value": "和平区", "checked": "0"},          {"code": "120102", "value": "河东区", "checked": "1"}        ]      }    ]  }]

目标扁平化数据结构示例:

[  {    "provinceCode": "110000",    "cityCode": null,    "districtCode": null,    "level": 1  },  {    "provinceCode": "120000",    "cityCode": "120100",    "districtCode": "120102",    "level": 3  }]

转换逻辑:

采用递归遍历树状结构,根据 checked 状态判断。如果所有子节点都被选中,则只保留父节点信息;如果部分子节点被选中,则保留所有被选中的节点信息。

JavaScript 实现代码:

function flattenData(data) {  const result = [];  function traverse(node, parent) {    if (node.checked === "1") {      const item = {        provinceCode: parent ? parent.provinceCode : node.code,        cityCode: parent ? (parent.cityCode || (parent.level === 1 ? node.code : null)) : null,        districtCode: parent ? (parent.level === 2 ? node.code : null) : null,        level: parent ? parent.level + 1 : 1      };      result.push(item);    }    if (node.children) {      node.children.forEach(child => traverse(child, item));    }  }  data.forEach(province => traverse(province));  return result;}// 示例用法const data = [/* 原始数据 */];const flattenedData = flattenData(data);console.log(flattenedData);

这段代码通过递归函数 traverse 遍历树形结构,根据 checked 属性和父节点信息构建扁平化数据。 它使用了更简洁的逻辑,避免了多个嵌套函数,并对代码进行了优化。 level 属性直接根据父节点的 level 推断,简化了逻辑。

以上就是如何将省市区树状结构数据扁平化处理?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1563555.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月22日 08:25:01
下一篇 2025年12月15日 20:30:02

相关推荐

  • CSS如何实现不规则形状,例如梯形边框?

    css打造个性化边框:轻松实现梯形等不规则形状 许多网页设计师在使用CSS进行页面布局时,常常需要创建一些特殊形状的边框,例如图片所示的梯形边框。本文将详细讲解如何运用CSS技巧,巧妙地实现这些不规则边框效果。 直接使用CSS的border属性无法创建梯形等不规则形状,因为border属性只能生成矩…

    2025年12月22日
    000
  • Vue组件选项卡下如何实现多个组件实例的数据独立?

    vue组件选项卡:实现多个组件实例数据独立 本文介绍如何使用Vue组件和选项卡组件,动态显示多个相同组件的实例,并确保每个实例的数据相互独立。 问题:开发者希望通过选项卡(例如,使用el-radio-group)切换不同的组件,且同一组件可被多次加载,每次加载都拥有独立数据。使用keep-alive…

    2025年12月22日
    000
  • JavaScript与HTML交互:事件流向究竟是单向还是双向?

    javascript和html元素交互:事件流向深度解析 JavaScript通过事件机制与HTML元素互动,例如点击按钮或表单提交等用户行为都会触发相应的事件,进而执行JavaScript函数。 那么,这种交互是单向还是双向的? 理解事件的关键在于其触发作用:事件标志着JavaScript函数执行…

    2025年12月22日
    000
  • CSS如何实现特殊形状(例如梯形)边框?

    css打造个性化梯形边框 在网页设计中,常常需要一些独特的形状来提升视觉效果。例如,如何只用CSS代码创建如上图所示的梯形边框呢? 直接使用CSS的border属性无法实现这种不规则形状。 巧妙的解决方法是利用额外的div元素和伪元素(:before 或 :after)来模拟梯形。 通过创建辅助di…

    2025年12月22日
    000
  • Uniapp小程序事件对象:如何获取自定义属性?

    uniapp小程序事件对象:轻松获取自定义属性 在Uniapp小程序开发中,我们经常需要在组件事件处理函数中访问自定义属性。然而,直接从事件对象中获取这些属性值有时会失败。例如,以下代码: 点击 在handleClick函数中,尝试通过event.target获取msg-data的值,却无法找到该属…

    2025年12月22日
    000
  • 前端SVG图像展示:如何将SVG文件转换为编码并嵌入网页?

    前端svg图像展示:巧用编码嵌入网页提升性能 在网页开发中,引入SVG图像的方法多种多样。有些开发者直接使用的方式引入SVG文件,而另一些则偏好将SVG代码直接嵌入HTML。这两种方法的主要区别在于加载方式:前者需要浏览器额外发起HTTP请求加载SVG文件,而后者则直接将SVG代码渲染,尤其在SVG…

    好文分享 2025年12月22日
    000
  • JavaScript日期处理如此反直觉,有哪些库可以轻松解决?

    javascript日期处理的困惑与解决方案 JavaScript内置的Date对象在处理日期和时间方面存在一些不符合直觉的设计,这给开发者带来了困扰。例如,星期几的表示方式与国际标准(ISO 8601)不一致,月份的表示也存在歧义,最后一天的表示更是反直觉。 具体来说,getDay()方法返回的星…

    好文分享 2025年12月22日
    000
  • 网页上绘制连接点的线段:Canvas和SVG哪种方案更优?

    在网页上绘制连接点的线段:html、js实现方案 如何在网页上随机生成若干个点,并允许用户通过手势连接这些点?这是一个常见的前端交互需求。本文将详细探讨如何使用HTML和JavaScript实现这一功能,并提供两种不同的技术方案。 图片展示了目标效果:页面上出现多个点,用户可以自由连接这些点。实现这…

    好文分享 2025年12月22日
    000
  • Element UI表单动态校验:如何解决异步数据导致的校验规则错乱和提示文案残留问题?

    element ui表单动态校验及异步数据导致的校验问题 在使用Element UI的el-form组件进行表单校验时,如果校验规则依赖异步接口返回的数据,且接口响应较慢,则可能出现校验规则错乱,例如:初始校验规则为必填,但接口返回后变为非必填,虽然必填星号消失,但必填提示文案却残留。本文分析并解决…

    2025年12月22日
    000
  • UniApp小程序中,如何通过事件对象获取自定义属性?

    uniapp小程序:巧妙获取事件对象中的自定义属性 在UniApp小程序开发中,我们经常需要在事件处理函数里访问自定义属性。例如,点击一个带有自定义属性的按钮,获取该属性值。然而,直接从事件对象中获取这些属性值时,可能会遇到问题。本文将深入探讨这个问题,并提供有效的解决方案。 问题:无法直接获取自定…

    2025年12月22日
    000
  • 移动端CSS滚动条隐藏异常:外层div的border-radius属性与overflow:auto冲突如何解决?

    移动端css滚动条显示异常及解决方案 在移动端开发中,overflow: auto结合border-radius经常导致滚动条显示异常:第一次滚动后隐藏,第二次却一直显示。本文分析此问题并提供解决方案。 问题代码示例: 长文本内容… 问题根源在于外层div #f 的 border-radius …

    2025年12月22日
    000
  • JavaScript代码如何优雅换行?

    JavaScript代码优雅换行技巧 在编写javascript代码时,经常会遇到一行代码过长的情况,这不仅影响代码的可读性,也降低了代码的可维护性。与python使用反斜杠\进行简单的换行不同,javascript的换行处理需要一些技巧。本文将针对javascript代码换行问题,特别是处理长字符…

    好文分享 2025年12月22日
    000
  • 如何用JavaScript自定义鼠标滚轮滚动页面距离?

    javascript自定义鼠标滚轮滚动距离:提升网页交互体验 在网页开发中,开发者经常需要微调页面滚动行为,例如调整鼠标滚轮滚动速度或距离。本文将详细讲解如何利用JavaScript技术实现自定义鼠标滚轮滚动距离,并提供代码示例,帮助您优化网页交互体验。 目标:修改鼠标滚轮每次滚动的默认页面滚动距离…

    2025年12月22日
    000
  • JavaScript代码过长如何优雅换行?

    javascript 代码换行最佳实践 编写整洁易读的 JavaScript 代码至关重要。长代码行不仅影响可读性,还会增加出错的可能性。本文将介绍如何优雅地将过长的 JavaScript 代码换行。 问题:过长的 getElementById() 调用 例如,以下代码获取网页元素的 innerTe…

    2025年12月22日
    000
  • 如何让div容器根据内容自适应大小并自动换行?

    灵活布局:让div容器自适应内容并自动换行 网页布局中,常常需要div容器根据内部内容自动调整大小,并确保文本内容能够自动换行,避免因宽度固定导致布局混乱。本文将探讨解决此问题的最佳方案,并分析text-align: center;和display属性对布局的影响。 许多开发者尝试使用display…

    2025年12月22日
    000
  • CSS样式冲突:如何精准选择内部h3标签避免全局样式影响?

    巧妙解决css样式冲突:精准定位内部h3标签 在维护老旧项目时,经常会遇到全局CSS样式与局部样式冲突的问题。例如,全局样式定义了h3标签的样式,而文章内容(位于id为ac_content的div内)中的h3标签需要不同的样式。如何避免全局样式影响文章内容,又不修改全局样式呢? 关键在于使用精准的选…

    2025年12月22日
    000
  • Element UI表单动态校验:如何解决数据延迟导致的校验规则闪烁问题?

    element ui表单动态校验:巧妙解决数据延迟导致的校验规则闪烁 在使用Element UI的el-form组件进行表单动态校验时,如果后端接口响应较慢,可能会出现校验规则闪烁的问题。例如,一个字段的必填属性(required)因数据回显延迟而发生变化,导致校验规则在短时间内出现不一致,影响用户…

    2025年12月22日
    000
  • JavaScript对象如何转换为包含id、name和子对象数组的新对象数组?

    本文介绍如何将一个javascript对象转换为特定结构的对象数组。原始对象结构如下: const obj = { “a”: [“a1”, “a2”], “b”: [“b1”, “b2”, “b3”] // 子数组长度不固定}; 目标是将其转换为: const list = [ { id: 1, n…

    2025年12月22日
    000
  • 移动端CSS滚动条隐藏失效:为什么border-radius会影响overflow:hidden的滚动条隐藏?

    移动端css滚动条隐藏失效:border-radius与overflow:hidden的冲突详解 在移动端开发中,巧妙地控制滚动条的显示和隐藏,对于提升用户体验至关重要。然而,一些CSS样式的组合却可能导致意想不到的问题,例如滚动条在多次滚动后无法隐藏。本文将深入分析一个典型案例,并提供有效的解决方…

    2025年12月22日
    000
  • 如何用CSS3和JavaScript实现点击图片散放放大效果?

    CSS3和JavaScript打造炫酷图片点击散放放大效果 本文将详细讲解如何使用css3和javascript实现点击图片后,周围图片散开并自身放大的动态效果。 这并非简单的图片切换,而是通过精巧的代码,动态调整图片位置和大小,营造出引人入胜的视觉冲击和交互体验。 实现的关键在于巧妙结合CSS3的…

    2025年12月22日 好文分享
    000

发表回复

登录后才能评论
关注微信