如何基于多级筛选器动态分组并展示 JSON 数据

雨明酱_4609

雨明酱_4609

2026-05-15

573人浏览

原创

如何基于多级筛选器动态分组并展示 JSON 数据

本文详解如何使用原生 javascript(配合 jquery)根据国家、州/省、城市三级下拉筛选,实时加载并分组展示关联的 json 数据,包含联动筛选逻辑、数据结构优化建议及结果渲染实现。

本文详解如何使用原生 javascript(配合 jquery)根据国家、州/省、城市三级下拉筛选,实时加载并分组展示关联的 json 数据,包含联动筛选逻辑、数据结构优化建议及结果渲染实现。

在构建地理层级筛选功能时,核心目标不仅是实现下拉联动(如选中国家后动态加载对应州),更要在用户完成多级选择后,精准提取并结构化展示该地理路径下的完整数据组——例如:选择 “USA → New York → New York city”,不仅显示该城市信息,还应一并呈现其所属州、国家及其他同属该州的城市(即“分组展示”)。以下为完整实现方案。

一、数据预处理:构建可检索的层级映射关系

原始 JSON 是扁平化结构(仅靠 parent_id 关联),直接多次遍历过滤效率低且易出错。推荐在页面初始化时一次性解析并建立三类索引:

Wjs Uploading Video
Wjs Uploading Video

将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。

下载
let geoData = [];
let countries = {};
let states = {};
let cities = {};

$.getJSON('./data/country_state_city.json', function(data) {
    geoData = data;

    // 构建哈希映射:id → {id, name, parent_id}
    data.forEach(item => {
        const obj = { id: item.id, name: item.name, parent_id: item.parent_id };
        if (item.parent_id === '0') {
            countries[item.id] = obj;
        } else if (countries[item.parent_id]) {
            states[item.id] = obj;
        } else if (states[item.parent_id]) {
            cities[item.id] = obj;
        }
    });
});

二、增强筛选逻辑:支持三级联动 + 结果聚合展示

在原有 change 事件基础上,新增一个 #show-results 按钮或监听 #city 的最终变更,触发结果分组渲染:

// 添加结果展示容器
$('body').append('<div id="results-section" class="mt-4 p-3 bg-light rounded">
<h5>Matching Data Group</h5>
<div id="results-list"></div>
</div>');

function displayGroupedResults(countryId, stateId, cityId) {
    const results = [];

    // 1. 获取当前选中的城市对象
    const selectedCity = cities[cityId];
    if (!selectedCity) return;

    // 2. 向上追溯:获取所属州、国家
    const selectedState = states[stateId];
    const selectedCountry = countries[countryId];

    // 3. 向下聚合:获取同州所有城市(含当前城市)
    const siblingCities = Object.values(cities).filter(c => c.parent_id === stateId);

    // 4. 组装结构化结果组
    results.push({
        type: 'country',
        id: countryId,
        name: selectedCountry?.name || 'N/A'
    });
    results.push({
        type: 'state',
        id: stateId,
        name: selectedState?.name || 'N/A'
    });
    results.push({
        type: 'selected-city',
        id: cityId,
        name: selectedCity.name
    });
    results.push({
        type: 'sibling-cities',
        count: siblingCities.length,
        list: siblingCities.map(c => ({ id: c.id, name: c.name }))
    });

    // 渲染 HTML
    let html = '
    '; results.forEach(item => { if (item.type === 'sibling-cities') { html += `
  • ${item.count} cities in ${selectedState?.name}:
      ${item.list.map(c => `
    • ${c.name} (ID: ${c.id})
    • `).join('')}
  • `; } else { html += `
  • ${item.type}: ${item.name} (ID: ${item.id})
  • `; } }); html += '
'; $('#results-list').html(html); } // 绑定城市选择后的结果展示 $(document).on('change', '#city', function() { const countryId = $('#country').val(); const stateId = $('#state').val(); const cityId = $(this).val(); if (countryId && stateId && cityId) { displayGroupedResults(countryId, stateId, cityId); } else { $('#results-list').empty(); } });

三、关键注意事项与优化建议

  • ✅ 避免重复请求:$.getJSON 仅在初始化时调用一次,后续所有筛选均基于内存中已解析的 geoData 或映射对象,大幅提升响应速度;
  • ✅ 健壮性校验:每次访问 countries[stateId] 等前务必检查存在性,防止 undefined 导致脚本中断;
  • ⚠️ JSON 结构升级建议:如需扩展属性(时区、人口、经纬度等),强烈建议重构为嵌套结构(如 countries[].states[].cities[]),而非维持扁平 ID 链。这将使 filter() 和 find() 操作更直观:
    // 示例:现代结构(便于多维筛选)
    const structuredData = [
      {
        "country": "USA",
        "states": [
          {
            "name": "New York",
            "cities": [
              { "name": "New York city", "timezone": "EST" },
              { "name": "Buffalo", "timezone": "EST" }
            ]
          }
        ]
      }
    ];
  • ? 进阶方向:若项目规模扩大,可迁移至 React/Vite 架构,利用 useState + useEffect 管理筛选状态,并通过 useMemo 高效缓存分组结果,显著提升可维护性与性能。

通过以上实现,你不仅能完成三级联动筛选,更能以清晰、可扩展的方式分组呈现地理层级数据全貌——真正实现“所选即所见,所见即所属”。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js json

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

6075

7

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

3412

4

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.31

3090

5

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.01

3119

5

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2023.08.11

4879

6

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

2023.08.11

3061

3

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

2869

3

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

2023.09.01

2528

6

HTML嵌入CSS样式的方法
HTML嵌入CSS样式的方法

HTML嵌入CSS样式的方法有内联样式、内部样式表和外部样式表。本专题为大家提供CSS样式相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.20

2588

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.8万人学习