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

React Native:根据动态state获取JSON中的FK_Diagnosis_Content_ID

解决方案:根据选中状态提取对应FK_Diagnosis_Content_ID

先梳理下你的需求:你从API拿到的分类数据存在this.state.data中,同时通过状态维护用户的选中项this.state.selected,需要从数据里匹配每个选中项对应的FK_Diagnosis_Content_ID并收集成数组。

你的数据结构(this.state.data)

[
  {
    "name": "Primary Category",
    "value": [
      {
        "value": "Fracture",
        "Diagnosis_Code": ["DIAG003"],
        "name": "Primary Category",
        "FK_Diagnosis_Content_ID": 3,
        "FK_Diagnosis_Category_ID": 1
      },
      {
        "value": "Osteoarthritis",
        "Diagnosis_Code": ["DIAG001"],
        "name": "Primary Category",
        "FK_Diagnosis_Content_ID": 1,
        "FK_Diagnosis_Category_ID": 1
      },
      {
        "value": "Osteonecrosis",
        "Diagnosis_Code": ["DIAG002", "DIAG004"],
        "name": "Primary Category",
        "FK_Diagnosis_Content_ID": 2,
        "FK_Diagnosis_Category_ID": 1
      }
    ]
  },
  {
    "name": "Anatomy",
    "value": [
      {
        "value": "Hip",
        "Diagnosis_Code": ["DIAG001"],
        "name": "Anatomy",
        "FK_Diagnosis_Content_ID": 4,
        "FK_Diagnosis_Category_ID": 2
      },
      {
        "value": "Pelvis",
        "Diagnosis_Code": ["DIAG002", "DIAG003", "DIAG004"],
        "name": "Anatomy",
        "FK_Diagnosis_Content_ID": 6,
        "FK_Diagnosis_Category_ID": 2
      }
    ]
  }
]

状态维护函数(先提个小问题)

你当前用这个函数更新选中状态:

onChangeTextPress(key, value){
  this.state.selected[key] = value
  //其他代码
}

⚠️ 这里要提醒下:React里绝对不能直接修改state,直接赋值不会触发组件重新渲染,正确的写法应该是用setState方法:

onChangeTextPress(key, value){
  this.setState(prevState => ({
    selected: {
      ...prevState.selected,
      [key]: value
    }
  }))
  //其他代码
}

选中状态示例(this.state.selected)

{ 'Primary Category': 'Fracture', 'Anatomy': 'Hip' }


核心解决方案:提取对应ID的函数

你可以写一个专门的函数处理匹配逻辑,遍历选中的键值对,在数据中找到对应分类和选项,最后收集ID:

getSelectedContentIds() {
  const { data, selected } = this.state;
  const ids = [];

  // 遍历每个选中的分类和对应值
  Object.entries(selected).forEach(([categoryName, selectedValue]) => {
    // 找到数据中对应的分类
    const targetCategory = data.find(item => item.name === categoryName);
    if (!targetCategory) return; // 找不到分类就跳过

    // 在分类的选项里匹配选中值对应的项
    const matchedItem = targetCategory.value.find(item => item.value === selectedValue);
    if (matchedItem) {
      ids.push(matchedItem.FK_Diagnosis_Content_ID);
    }
  });

  return ids;
}

使用示例

当你需要获取结果时,直接调用这个函数即可:

const result = this.getSelectedContentIds();
console.log(result); // 对应示例选中状态,会输出 [3,4]

额外优化建议

如果你的数据量较大,可以在组件初始化或数据更新时,把data转换成以分类名为键的映射对象,这样后续查找分类的效率会更高:

// 比如在componentDidMount或useEffect中处理
const categoryMap = this.state.data.reduce((map, category) => {
  map[category.name] = category.value;
  return map;
}, {});
// 之后查找分类直接用 categoryMap[categoryName] 即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:17:04