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

如何正确将字典数组映射到Select下拉选择器?

嘿,问题很明显啦——你在map的时候用了year.value和year.display,但你的dateArray里每个对象的属性明明是year和month啊!这些不存在的属性当然会让选项显示空内容啦😉

下面分几种场景给你解决方案:

场景1:直接渲染所有年份/月份(含重复项)

如果只是想把数组里每一项的年份、月份分别放到两个下拉框,直接访问对象的year和month属性即可,同时注意设置合理的key值:

// 年份下拉框
<select className='form-control'>
  {this.state.dateArray.map((item, index) => (
    <option key={index} value={item.year}>{item.year}</option>
  ))}
</select>

// 月份下拉框
<select className='form-control'>
  {this.state.dateArray.map((item, index) => (
    <option key={index} value={item.month}>{item.month}</option>
  ))}
</select>

场景2:渲染去重后的年份/月份(更实用)

上面的写法会出现重复选项(比如2018出现两次、02出现两次),所以更合理的做法是先提取唯一的年份和月份:

render() {
  // 提取唯一年份集合
  const uniqueYears = [...new Set(this.state.dateArray.map(item => item.year))];
  // 提取唯一月份集合
  const uniqueMonths = [...new Set(this.state.dateArray.map(item => item.month))];

  return (
    <div>
      <select className='form-control'>
        {uniqueYears.map(year => (
          <option key={year} value={year}>{year}</option>
        ))}
      </select>

      <select className='form-control'>
        {uniqueMonths.map(month => (
          <option key={month} value={month}>{month}</option>
        ))}
      </select>
    </div>
  )
}

场景3:联动下拉框(选年份后显示对应月份)

如果想要更友好的交互——选完年份才显示对应月份,可以维护一个选中年份的状态,再动态过滤数组:

class YourComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      dateArray: [ {year:'2016', month: "01"}, {year:'2017', month: "01"}, {year:'2018', month: "02"}, {year:'2018', month: "02"} ],
      selectedYear: ""
    };
  }

  handleYearChange = (e) => {
    this.setState({ selectedYear: e.target.value });
  }

  render() {
    const { dateArray, selectedYear } = this.state;
    const uniqueYears = [...new Set(dateArray.map(item => item.year))];
    // 根据选中年份过滤并去重月份
    const filteredMonths = selectedYear 
      ? [...new Set(dateArray.filter(item => item.year === selectedYear).map(item => item.month))]
      : [];

    return (
      <div>
        <select 
          className='form-control' 
          onChange={this.handleYearChange} 
          value={selectedYear}
        >
          <option value="">请选择年份</option>
          {uniqueYears.map(year => (
            <option key={year} value={year}>{year}</option>
          ))}
        </select>

        <select 
          className='form-control' 
          disabled={!selectedYear}
        >
          <option value="">请选择月份</option>
          {filteredMonths.map(month => (
            <option key={month} value={month}>{month}</option>
          ))}
        </select>
      </div>
    );
  }
}

这样就能完美解决你的问题啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:22:15