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

JSP中如何遍历数组并筛选得到唯一的对象列表?

问题解决方案

根因定位

问题核心来自两点:

  • 反复在real_estate列表循环内调用rz.fetch查询estate_features表,该方法会复用框架内部的全局查询上下文/缓存,当第二个房产对应的feature id查询匹配不到残留上下文内容时,会错误返回全量特性数据
  • 若你是多房产同时提交的场景,所有房产的表单字段(隐藏域selected_features、checkbox字段selected_features_box)命名完全重复,提交时会互相覆盖值,导致第二个房产存储的是全量特性id

修复方案

1. 优化列表展示逻辑(解决显示全量特性问题)

提前把所有房产特性加载到内存Map,避免循环内反复查询数据库,同时规避框架上下文冲突问题,代码修改如下:

<%
// 在real_estate列表循环外先加载全量特性映射
Map<String, String> featureMap = new HashMap<>();
rz.listinit("estate_features", "seq_no asc", "", "noscript");
while(rz.listnext() && rz.listindex >= 0) {
    String featureId = rz.fetch("estate_features", "_recordid");
    String featureText = rz.fetch("estate_features", "feature_text");
    featureMap.put(featureId, featureText);
}
%>

<!-- 原有的real_estate列表循环逻辑修改 -->
<rz:list module="real_estate" sort="seq_no asc" output="none" options="noscript" filter="<%="pageid=property-"+rz.pageid%>"><%
while(rz.listnext() && rz.listindex >= 0) {%><rz:listbody>

<%
    String features = rz.fetch("real_estate", "selected_features"); 
    String[] feature_arr = StringUtils.split(features, "|");
                                                   
    for (int i=0; i < feature_arr.length; i++ ) {   
        if(!feature_arr[i].equals("") && featureMap.containsKey(feature_arr[i])){
            String feature_name = featureMap.get(feature_arr[i]);
%>
<li>
    <span><%=feature_name%></span> 
</li>
    <% } } %>
</rz:listbody>
    <% } %>
</rz:list>

2. 修复表单提交冲突(多房产同时提交场景适用)

给每个房产的表单字段加上唯一标识,避免重名覆盖:

<% 
// 每个房产取自身唯一recordid拼接字段名
String currentEstateId = rz.fetch("real_estate", "_recordid");
String selected_features = rz.fetch("real_estate", "selected_features");
%>
<input name="selected_features_<%=currentEstateId%>" type="hidden" value="<%=selected_features%>"/>

<rz:list module="estate_features" sort="seq_no asc" output="none" options="noscript" filter="">
<%
while(rz.listnext() && rz.listindex >= 0) {
%><rz:listbody>
<div class="rz-checkbox">
<%
    String featureName = rz.fetch("estate_features", "feature_text");
    String recordid = rz.fetch("estate_features", "_recordid");
    // 字段名拼接房产id
    String selected = "selected_features_box_"+currentEstateId;
%>
<rzt:checkbox
  label="<%=featureName%>"
  field="<%=selected%>"
  checkedValue="<%=rz.fetch("estate_features", "_recordid")%>"
  target=""
  checked="<%=("|"+selected_features+"|").indexOf("|"+recordid+"|") >= 0 ? "true" : "false"%>"
/>
<%=("|"+selected_features+"|").indexOf("|"+recordid+"|") >= 0 ? "true" : "false"%>
</div><!-- /.rz-checkbox -->
</rz:listbody>
<% } %>
</rz:list>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 09:21:05