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

如何基于两个select下拉框选中值双向过滤指定数组数据

双下拉框双向联动过滤实现方案

实现思路

  • 首先对原始字符串数组做结构化解析,提前构建「用户-餐品」「餐品-用户」两个映射表,同时存储全量的用户、餐品集合,避免每次过滤都遍历原始数组,提升运行效率
  • 维护两个变量分别存储当前选中的用户、餐品值,作为下拉框选项渲染的过滤依据
  • 两个下拉框的选中变更事件分别触发对面下拉框的选项重渲染,实现双向过滤联动

完整可运行代码

HTML 结构

<div>
  <label>选择用户:</label>
  <select id="userSelect">
    <option value="">--请选择--</option>
  </select>
</div>
<div style="margin: 10px 0;">
  <label>选择餐品:</label>
  <select id="foodSelect">
    <option value="">--请选择--</option>
  </select>
</div>

JavaScript 逻辑

// 原始数据
const rawArr = ['Sarah:cookie', 'Sarah:french fries', 'Sarah:soup', 'John:cookie', 'John:water', 'John:sandwich']

// 数据预处理,构建映射关系
const userToFoods = {}
const foodToUsers = {}
const allUsers = new Set()
const allFoods = new Set()

rawArr.forEach(item => {
  const [user, food] = item.split(':')
  allUsers.add(user)
  allFoods.add(food)
  // 填充用户对应餐品的映射
  if (!userToFoods[user]) userToFoods[user] = []
  userToFoods[user].push(food)
  // 填充餐品对应用户的映射
  if (!foodToUsers[food]) foodToUsers[food] = []
  foodToUsers[food].push(user)
})

const userSelect = document.getElementById('userSelect')
const foodSelect = document.getElementById('foodSelect')
// 存储当前选中状态
let currentSelectedUser = ''
let currentSelectedFood = ''

// 渲染用户下拉框
function renderUserSelect() {
  userSelect.innerHTML = '<option value="">--请选择--</option>'
  // 选中餐品时过滤用户,否则展示全量用户
  const showUsers = currentSelectedFood ? foodToUsers[currentSelectedFood] : [...allUsers]
  showUsers.forEach(user => {
    const option = document.createElement('option')
    option.value = user
    option.textContent = user
    if (user === currentSelectedUser) option.selected = true
    userSelect.appendChild(option)
  })
}

// 渲染餐品下拉框
function renderFoodSelect() {
  foodSelect.innerHTML = '<option value="">--请选择--</option>'
  // 选中用户时过滤餐品,否则展示全量餐品
  const showFoods = currentSelectedUser ? userToFoods[currentSelectedUser] : [...allFoods]
  showFoods.forEach(food => {
    const option = document.createElement('option')
    option.value = food
    option.textContent = food
    if (food === currentSelectedFood) option.selected = true
    foodSelect.appendChild(option)
  })
}

// 初始化渲染
renderUserSelect()
renderFoodSelect()

// 绑定联动事件
userSelect.addEventListener('change', e => {
  currentSelectedUser = e.target.value
  currentSelectedFood = ''
  renderFoodSelect()
})

foodSelect.addEventListener('change', e => {
  currentSelectedFood = e.target.value
  currentSelectedUser = ''
  renderUserSelect()
})

效果说明

  • 未选中任何选项时,两个下拉框分别展示全量用户、全量餐品
  • 选中指定用户后,餐品下拉框仅展示该用户对应的所有餐品
  • 选中指定餐品后,用户下拉框仅展示提供该餐品的所有用户

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 06:42:03