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
相关产品推荐
相关产品推荐

