当前位置: 首页 > news >正文

JavaScript 中JSON 数据遍历

JavaScript 中JSON 数据遍历

1. JSON 字符串转对象后遍历

1.1 解析 JSON 字符串

const jsonString = '{"users": [{"id": 1, "name": "张三"}, {"id": 2, "name": "李四"}]}';
const data = JSON.parse(jsonString);// 遍历数组
data.users.forEach(user => {console.log(`ID: ${user.id}, 姓名: ${user.name}`);
});// 1.2 从 API 获取的 JSON
fetch('/api/user/realname/王').then(response => response.json()).then(data => {// 遍历返回的 JSON 数据if (Array.isArray(data)) {data.forEach(user => {console.log(user.realname, user.email);});}});

2. 遍历 JSON 对象(Object)

const user = {"id": 1,"username": "zhangsan","realname": "张三","email": "zhangsan@example.com","department": {"id": 101,"name": "技术部"}
};// 2.1 Object.keys() + forEach
Object.keys(user).forEach(key => {console.log(`${key}: ${user[key]}`);
});// 2.2 for...in 循环(会遍历原型链属性)
for (const key in user) {if (user.hasOwnProperty(key)) {console.log(`${key}: ${user[key]}`);}
}// 2.3 Object.entries() - 获取键值对数组
Object.entries(user).forEach(([key, value]) => {console.log(`${key}: ${JSON.stringify(value)}`);
});// 2.4 Object.values() - 只获取值
Object.values(user).forEach(value => {console.log(value);
});

3. 遍历嵌套的 JSON 数据

const company = {"companyName": "ABC公司","departments": [{"id": 1,"name": "技术部","employees": [{"id": 101, "name": "张三", "role": "前端开发"},{"id": 102, "name": "李四", "role": "后端开发"}]},{"id": 2,"name": "市场部","employees": [{"id": 201, "name": "王五", "role": "市场专员"}]}]
};// 3.1 多层嵌套遍历
company.departments.forEach(dept => {console.log(`部门: ${dept.name}`);dept.employees.forEach(emp => {console.log(`  - ${emp.name} (${emp.role})`);});
});// 3.2 递归遍历所有属性
function traverseJSON(obj, depth = 0) {const indent = '  '.repeat(depth);if (Array.isArray(obj)) {obj.forEach(item => traverseJSON(item, depth + 1));} else if (obj !== null && typeof obj === 'object') {Object.entries(obj).forEach(([key, value]) => {if (typeof value === 'object') {console.log(`${indent}${key}:`);traverseJSON(value, depth + 1);} else {console.log(`${indent}${key}: ${value}`);}});} else {console.log(`${indent}${obj}`);}
}traverseJSON(company);

4. 处理从 API 返回的 JSON 数据

// 假设 API 返回:{ "success": true, "data": [{...}, {...}], "total": 2 }async function fetchAndProcessUsers() {try {const response = await fetch('/api/users');const result = await response.json();// 4.1 检查 API 返回状态if (!result.success) {throw new Error(result.message || '请求失败');}// 4.2 遍历数据const users = result.data;// 方式1: 简单遍历users.forEach((user, index) => {console.log(`用户${index + 1}:`, user);});// 方式2: 使用 map 转换数据const userNames = users.map(user => ({id: user.id,displayName: `${user.realname} (${user.username})`,department: user.deptname}));// 方式3: 使用 filter 筛选const activeUsers = users.filter(user => user.status === 'active' && user.deptname === '技术部');// 方式4: 使用 reduce 统计const departmentCount = users.reduce((acc, user) => {acc[user.deptname] = (acc[user.deptname] || 0) + 1;return acc;}, {});console.log('部门统计:', departmentCount);return userNames;} catch (error) {console.error('处理数据失败:', error);}
}

5. 将遍历结果转为 HTML

async function displayUsersInTable() {const response = await fetch('/api/user/realname/王');const users = await response.json();const tableBody = document.querySelector('#userTable tbody');tableBody.innerHTML = ''; // 清空现有内容// 遍历 JSON 数据生成表格行users.forEach(user => {const row = document.createElement('tr');// 创建单元格const cells = [user.id,user.realname,user.username,user.deptname,user.mobile,user.email];cells.forEach(cellData => {const cell = document.createElement('td');cell.textContent = cellData || 'N/A';row.appendChild(cell);});// 添加操作按钮const actionCell = document.createElement('td');actionCell.innerHTML = `<button onclick="editUser(${user.id})">编辑</button><button onclick="deleteUser(${user.id})">删除</button>`;row.appendChild(actionCell);tableBody.appendChild(row);});
}

使用模板字符串

function displayUsersWithTemplate(users) {const container = document.getElementById('userContainer');const userCards = users.map(user => `<div class="user-card"><h3>${escapeHtml(user.realname)}</h3><p><strong>用户名:</strong> ${escapeHtml(user.username)}</p><p><strong>部门:</strong> ${escapeHtml(user.deptname || '未分配')}</p><p><strong>手机:</strong> ${escapeHtml(user.mobile || 'N/A')}</p><p><strong>邮箱:</strong> ${escapeHtml(user.email || 'N/A')}</p><button class="btn-view" data-id="${user.id}">查看详情</button></div>`).join('');container.innerHTML = userCards;// 添加事件监听container.querySelectorAll('.btn-view').forEach(button => {button.addEventListener('click', (e) => {const userId = e.target.dataset.id;viewUserDetail(userId);});});
}

防止 XSS 攻击的简单转义函数

function escapeHtml(text) {const div = document.createElement('div');div.textContent = text;return div.innerHTML;
}

6. 使用现代 JavaScript 特性

6.1 使用可选链和空值合并

users?.forEach(user => {const email = user.email ?? '暂无邮箱';const dept = user.department?.name ?? '未分配部门';console.log(`${user.realname} - ${dept} - ${email}`);
});

6.2 使用解构赋值

users.forEach(({ id, realname: name, email = '无邮箱' }) => {console.log(`ID: ${id}, 姓名: ${name}, 邮箱: ${email}`);
});

6.3 使用 flatMap 处理嵌套数组

const allEmployees = companyData.departments.flatMap(dept => dept.employees.map(emp => ({...emp,department: dept.name}))
);

6.4 使用 Set 去重

const uniqueDepartments = [...new Set(users.map(user => user.deptname))];
http://www.jsqmd.com/news/57167/

相关文章:

  • 这家法兰螺母企业,凭什么获超高评价?
  • 2025年江西十大智能出入口解决方案企业推荐,百胜智能靠谱企
  • 2025年口碑好的干锅鸭品牌推荐:售后完善、口碑不错的干锅鸭
  • 电商国际短信群发平台推荐:营销短信平台服务与国际短信API接口对接选型指南
  • canvas在组件中循环画图时图片闪烁
  • 博士留学中介权威排名:面试辅导不过关的机构直接出局!
  • 2025年中国传统干锅鸭品牌推荐:好的干锅鸭大型品牌推荐有哪
  • PCIe-8052 双口万兆光纤图像采集卡:万兆传输赋能,解锁工业采集新速度
  • 构建人机共生的价值基石:LLM与人类协同构建价值原语行为网络
  • 2025博士留学中介权力榜:前八谁的导师网络最硬核?
  • 123年时光淬炼:从瑞士乡村集体创业到GPHG入围的HEBE镂空制表传奇
  • 2025年下半年内蒙古承载力检测服务商Top5推荐指南
  • 2025年特种工业泵供应商权威推荐榜单:工业泵/充填工业泵/耐磨泵源头厂家精选
  • 2025年高口碑灌浆防水涂料公司推荐,解决您的防水烦恼!
  • 2025年下半年房屋检测公司推荐排行榜:内蒙古鑫质检测有限公司领跑行业
  • 现今靠谱的短视频运营团队排行榜单
  • 想找闸机租赁源头厂家,这几点一定要知道!
  • 国内优秀的下载 maven jar 加速镜像站点
  • 如何用 vxe-table 实现粘贴数据自动进入新增行与新增列,数据无限扩充
  • 2025成都全包装修权威推荐,资质服务双优,装修/整装/家装/房屋装修品牌选择指南
  • 回头看基础,TemplatePrompt和MessagePrompt
  • 2025年碳纤木门制造商权威推荐榜单:套装门/实木门/无漆木门源头厂家精选
  • 2025年氯化镁阻化剂定制厂家权威推荐榜单:LH—Z01阻化剂‌/煤矿专用阻化剂‌/MSF—II阻化剂‌源头厂家精选
  • 2025商丘特色餐饮品牌口碑榜:商丘任广涛干锅鸭怎么样?
  • 【AP出版 | CPCI检索】第八届人文教育与社会科学国际学术会议(ICHESS 2025)
  • 10418_基于SSM的旅游管理系统
  • 2025年广州儿童黄埔军校夏令营学校权威推荐榜单:广州黄埔军校夏令营招生服务商/广州小学生黄埔军校军事夏令营培训/广州黄埔军校军事夏令营公司精选
  • 2025年耙式干燥设备制造厂权威推荐榜单:新型耙式干燥机‌/真空耙式干燥机‌/耙式干燥器‌源头厂家精选
  • 【IEEE出版 | EI检索】第二届机器学习、计算智能与模式识别国际学术会议(MLCIPR 2025)
  • 深度揭秘:湖南省网安基地——由“安服公司”开的网络安全培训班,到底是坑还是宝藏?​ - 指南