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

Next.js遍历对象生成下拉选项时如何去重并保留对应ID值

React 下拉选项去重并保留关联字段实现方案

你之前用Set直接存储CityName字符串做去重的写法,只能拿到去重后的城市名称文本,会丢失和名称绑定的CityId属性,无法满足option值绑定需求,下面是两种可直接落地的实现方式:

方案1:基于Map按唯一键去重(推荐)

同一个城市的CityId和CityName是一一绑定的,我们可以用CityId作为去重唯一键,借助Map键唯一的特性自动过滤重复项,最终输出的是完整的城市对象,可同时取到ID和名称字段。

{/* 城市下拉框 */}
<select>
  {Array.from(
    new Map(items.map(item => [item.CityId, item])).values()
  ).map(city => (
    <option key={city.CityId} value={city.CityId}>
      {city.CityName}
    </option>
  ))}
</select>

代码逻辑说明:

  • 遍历原始数组时,把每个项以[CityId, 完整item对象]的键值对存入Map
  • 相同CityId的重复项会被后续条目自动覆盖,最终Map里存的就是所有不重复的城市
  • 调用values()拿到所有不重复的城市对象转成数组,直接遍历渲染即可

方案2:基于Set标记已渲染值过滤

如果遇到字段映射关系更复杂的场景,也可以用Set存储已经出现过的唯一ID,遍历原始数组时过滤掉已经存在ID的重复项:

<select>
  {
    (() => {
      const addedCityIds = new Set();
      return items.filter(item => {
        if (addedCityIds.has(item.CityId)) return false;
        addedCityIds.add(item.CityId);
        return true;
      }).map(city => (
        <option key={city.CityId} value={city.CityId}>
          {city.CityName}
        </option>
      ))
    })()
  }
</select>

出发日期下拉框适配

出发日期的去重逻辑和城市完全一致,只需要把去重的唯一键换成和日期一一对应的DepartureId即可:

{/* 出发日期下拉框 */}
<select>
  {Array.from(
    new Map(items.map(item => [item.DepartureId, item])).values()
  ).map(departure => (
    <option key={departure.DepartureId} value={departure.DepartureId}>
      {departure.DeptDate.trim()}
    </option>
  ))}
</select>

注意:示例数据中DeptDate字段末尾带有多余空格,渲染时调用trim()可以避免显示异常。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:27:19