Dart 向已声明空Map新增/更新指定ques_id对应K,V键值对问题咨询
代码修改方案
问题根源
你原来的实现存在两个核心错误:
- 数据结构设计不合理:你直接将单道题的三个属性存到
optionSelection根Map中,无法存储多道题的答案,新增题目会覆盖已有题的数据。 - 逻辑判断完全颠倒:用
containsValue判断存在性效率极低,且存在时调用putIfAbsent的逻辑完全不符合需求。
推荐实现(支持存储多道题答案)
首先调整Map的定义,以questionId作为根Map的键,方便O(1)时间复杂度判断题目是否存在:
// 强类型声明更规范,也可以用你原来的动态类型写法 Map<int, Map<String, dynamic>> optionSelection = {};
点击按钮时的处理逻辑:
// 直接判断questionId是否是根Map的键即可 if (optionSelection.containsKey(questionId)) { // 题目已存在,仅更新用户答案 optionSelection[questionId]!['user_ans_id'] = selectedOption; // 如果需要同步更新quiz_id可补充下面一行 // optionSelection[questionId]!['quiz_id'] = selectedOption; } else { // 题目不存在,新增整组数据 optionSelection[questionId] = { "quiz_id": selectedOption, "ques_id": questionId, "user_ans_id": selectedOption, }; }
兼容原有结构的修改(仅支持存储单道题答案)
如果你坚持要用原来的根Map直接存单个题属性的结构,可按如下修改:
final quesExist = optionSelection['ques_id'] == questionId; if (quesExist) { optionSelection['user_ans_id'] = selectedOption; } else { optionSelection.addAll({ "quiz_id": selectedOption, "ques_id": questionId, "user_ans_id": selectedOption, }); }
内容的提问来源于stack exchange,提问作者Indrajeet Singh
相关产品推荐
相关产品推荐

