jQuery遍历JSON响应动态拼接HTML时输出[object Object]无法读取属性
问题根因
你页面上输出连续的[object Object],和value.MenuName的读取逻辑完全无关,核心错误出在遍历方法的返回值上:
$.each()是jQuery提供的遍历工具,它的默认返回值是你传入的待遍历目标本身(也就是你的data_obj数组),并不会把循环回调里写的HTML片段收集后返回- 你把
$.each()的执行结果直接传给.append()时,jQuery会把这个对象数组隐式转为字符串——数组内每个JS对象直接做字符串转换的结果就是[object Object],最终就形成了你看到的异常输出 - 你在循环内部写的HTML拼接代码,因为没有把生成的内容做存储,根本没有机会被渲染到页面上,自然会觉得
value.MenuName读不出来。
修正实现
调整遍历的逻辑流:先准备空字符串容器存所有要拼接的HTML,遍历过程中逐段拼接,循环跑完后再一次性追加到目标容器。
修正后的核心代码:
//load assigned menu $(".editItemText").on("click", function () { $("#CollapsibleItemPlaceHolder").empty(); var categoryId = $(this).attr("data-productId"); $('#btnSaveMenu').attr('categoryId', categoryId); $.post("/Demo/GetAssignedMenu", { CategoryId: categoryId }).done(function (data) { // 如果接口返回标准JSON格式,jQuery会自动解析,可去掉手动JSON.parse const data_obj = JSON.parse(data); let generatedHtml = ''; // 存储拼接的HTML内容 $.each(data_obj, function (key, value) { // 逐段拼接每一项的HTML generatedHtml += ` <div class="EachCategorySet"> <div class="accordion-heading"> <a class="accordion-toggle" data-toggle="collapse" href="#child_b"> <small>${value.MenuName}</small> </a> <div style="padding-left:16px; float:right; margin-top:-40px;" class="checkbox"> <label class="checkbox-container"> <input type="checkbox" class="css-checkbox parent_checkbox" name="selectall" /> <span data-ripple class="bg-primary-darker checkmark"></span> </label> </div> </div> </div>` }); // 遍历完成后一次性追加渲染 $("#CollapsibleItemPlaceHolder").append(generatedHtml); }); });
额外注意点
- 原代码的字符串拼接存在语法错误:混写反引号模板和
+运算符,把字符串首尾的加号错放在$.each闭包内部,会触发JS解析报错,统一用模板字符串插值语法能降低拼接出错概率 - 若接口响应头指定
Content-Type: application/json,jQuery会自动解析返回的JSON,此时手动调用JSON.parse(data)会触发类型错误,可根据实际接口逻辑调整 - 修正后
value.MenuName的属性读取逻辑是完全生效的,之前的读取异常本质是循环生成的内容没有进入渲染流程。
内容的提问来源于stack exchange,提问作者John Brk
相关产品推荐
相关产品推荐

