如何在 Angular 模板中遍历 JSON 对象并显示键值对

发布时间 - 2026-01-29 00:00:00    点击率:

本文详解如何使用 angular 内置的 `keyvaluepipe` 遍历任意 json 对象(非数组),在 html 模板中以 `

  • ` 列表形式清晰展示 `key: value` 结构,特别适用于对比展示“前/后”数据变更场景。

    在 Angular 中,*ngFor 默认仅支持可迭代对象(如数组),但 JSON 对象本身不可直接遍历。幸运的是,Angular 提供了内置管道 KeyValuePipe(自 v6.1 起可用),它能将对象自动转换为 {key: string, value: any}[] 形式的数组,从而完美适配 *ngFor。

    ✅ 正确的数据结构准备(TypeScript 层)

    关键前提是:确保组件 TS 文件中定义的属性名与模板中引用的名称完全一致,且结构扁平化。避免多层嵌套导致路径错误。

    根据你的 Handlebars 模板逻辑,应将数据简化为:

    // 在组件类中(例如 email-preview.component.ts)
    export class EmailPreviewComponent implements OnInit {
      Previous: Record = {};
      Current: Record = {};
    
      ngOnInit() {
        // 假设你已通过服务或输入获取到 formData
        const formData = {
          Message_Body: {
            formChanges: {
              Previous: { Events: 'TEST', AdditionalInfo: '' },
              Current: { Events: 'TEST111', AdditionalInfo: 'test' }
            }
          }
        };
    
        this.Previous = formData.Message_Body.formChanges.Previous;
        this.Current = formData.Message_Body.formChanges.Current;
      }
    }
    ⚠️ 注意:原代码中 templateInput = { Message_Body: { Previous, Current } } 会导致模板需写成 Message_Body.Message_Body.Previous —— 这是常见错误根源。务必解构赋值为顶层属性(如 Previous / Current),提升可读性与健壮性。

    ✅ HTML 模板:用 | keyvalue 管道遍历对象

    在 .html 文件中,直接使用 *ngFor + keyvalue 管道即可:

      

    Title: This following has been changed!

    Previous Values

    • {{ item.key }}: {{ item.value === '' || item.value == null ? '(empty)' : item.value }}

    No previous values.

    Current Values

    • {{ item.key }}: {{ item.value === '' || item.value == null ? '(empty)' : item.value }}

    No current values.

    ✅ 效果输出:

    Title: This following has been changed!
    
    Previous Values
    • Events: TEST
    • AdditionalInfo: (empty)
    
    Current Values
    • Events: T

    EST111 • AdditionalInfo: test

    ? 补充说明与最佳实践

    • keyvalue 管道默认按插入顺序排序(Angular ≥ 12),如需按字母序排列键,可传入比较函数:

    • compareKeys = (a: KeyValue, b: KeyValue) => 
        a.key.localeCompare(b.key);
    • 空值/undefined 安全处理:模板中使用 item.value === '' 显式判断空字符串(HTML 渲染时 {{ '' }} 会留白,建议统一提示为 (empty) 或 -)。

    • 性能提示:keyvalue 管道在每次变更检测时会创建新数组。若对象极大(>100 键),建议在组件中预处理为数组并 OnPush 策略优化。

    • 替代方案(不推荐):手动在 TS 中 Object.entries(obj) 转数组 → 更冗余,失去模板声明式优势;keyvalue 是 Angular 官方推荐的标准解法。

    掌握 | keyvalue,你就能优雅、简洁、可维护地渲染任意结构化 JSON 数据——无论是配置项、表单快照,还是审计日志中的字段变更对比。


  • # html  # js  # json  # go  # typescript  # ai  # win  # 键值对  # 可迭代对象  # 排列  # angular  # String  # Object  # 字符串  # 数据结构  # undefined  # 对象  # 遍历  # 的是  # 这是  # 就能  # 适用于  # 将对  # 如需  # 它能  # 表单 


    相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


    相关推荐: 如何在云主机上快速搭建网站?  简单实现Android验证码  如何获取免费开源的自助建站系统源码?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  Laravel定时任务怎么设置_Laravel Crontab调度器配置  Angular 表单中正确绑定输入值以确保提交与验证正常工作  如何在搬瓦工VPS快速搭建网站?  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  潮流网站制作头像软件下载,适合母子的网名有哪些?  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  Laravel如何配置任务调度?(Cron Job示例)  三星网站视频制作教程下载,三星w23网页如何全屏?  移动端脚本框架Hammer.js  Laravel怎么连接多个数据库_Laravel多数据库连接配置  Python面向对象测试方法_mock解析【教程】  简单实现jsp分页  Python文件异常处理策略_健壮性说明【指导】  如何在云服务器上快速搭建个人网站?  Laravel如何使用Telescope进行调试?(安装和使用教程)  香港网站服务器数量如何影响SEO优化效果?  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  高防服务器租用如何选择配置与防御等级?  如何在建站宝盒中设置产品搜索功能?  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  如何快速上传建站程序避免常见错误?  Firefox Developer Edition开发者版本入口  历史网站制作软件,华为如何找回被删除的网站?  🚀拖拽式CMS建站能否实现高效与个性化并存?  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  音响网站制作视频教程,隆霸音响官方网站?  微信小程序 scroll-view组件实现列表页实例代码  网站制作大概多少钱一个,做一个平台网站大概多少钱?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  Laravel如何实现用户注册和登录?(Auth脚手架指南)  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  黑客入侵网站服务器的常见手法有哪些?  微信小程序 wx.uploadFile无法上传解决办法  JavaScript数据类型有哪些_如何准确判断一个变量的类型  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  如何实现javascript表单验证_正则表达式有哪些实用技巧  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程