You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ajax如何将JavaScript对象数组渲染到视图中?

问题分析与解决方案

错误原因

你在$.map的回调函数里犯了逻辑错误:$.map会遍历data数组的每一个元素,每次循环的object是数组里的单个对象(比如第一次是data[0],第二次是data[1]),而非整个数组。当你试图访问object[1].name时,object是单个对象,根本不存在[1]这个索引,因此会抛出Cannot read properties of undefined (reading 'name')的错误。

当数组只有一个元素时,$.map仅遍历该元素,此时你可能误打误撞让object包含了name属性,所以代码能运行,但逻辑本身是错误的。

解决方案

你的需求是把data数组中两个对象的信息合并成一个渲染项,不需要用$.map遍历整个数组,直接从数组中取出对应元素的属性即可:

修改后的基础代码

// 替换原来的response部分
response([{
    label: data[0].product_name,
    value: data[0].product_id,
    price: data[0].price,
    name: data[1]?.name || '' // 用可选链避免data[1]不存在时报错
}]);

select: function (event, ui) {
    $('.product_name').val(ui.item.label);
    $('.price').val(ui.item.price);
    $('.product_id').val(ui.item.value);
    $('.name').val(ui.item.name);
    return false;
}

更鲁棒的写法(不依赖数组顺序)

如果控制器返回的数组元素顺序可能变化,你可以通过属性判断来定位对应的对象:

// 找到包含产品标识的对象
const product = data.find(item => item.product_id);
// 找到包含分类名称的对象
const category = data.find(item => item.name);

response([{
    label: product?.product_name || '',
    value: product?.product_id || '',
    price: product?.price || '',
    name: category?.name || ''
}]);

关键说明

  • $.map的作用是将数组的每个元素转换为新元素并返回新数组,你的场景是合并两个元素的属性,不需要遍历转换,直接构建单个对象即可。
  • 可选链操作符?.可以避免目标对象不存在时抛出错误,默认值''能确保视图不会显示undefined。

内容的提问来源于stack exchange,提问作者Vince

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 19:01:20