单选按钮未选中项求和功能实现咨询(附现有代码)
解决方案:为未选中选项添加分数计算
我明白你的需求啦——现在代码能搞定选中项的分数累加,但缺了「每个问题里未被选中的维度加2分」的逻辑。咱们先理清楚核心思路,再直接上修改后的代码:
核心逻辑拆解
你的每个问题是通过单选按钮的name属性分组的(比如Question1对应Left_1和Right_1,Question2对应Left_2和Right_2),所以我们需要:
- 先识别所有独立的问题组
- 对每个问题组,找出被选中的维度(
data-id) - 对每个未被选中的维度,给该维度加2分
- 最后叠加原有选中项的分数
修改后的完整代码
$("input[type='radio']").change(function() { // 用对象存储三个维度的分数,比单独变量更清晰 let scores = { Networking: 0, Recognition: 0, KnowledgeSeeking: 0 }; const allDimensions = Object.keys(scores); // 提取所有问题编号(从Left_*的name里拆分) const questionIds = new Set(); $("input[type='radio'][name^='Left_']").each(function() { const qId = $(this).attr('name').split('_')[1]; questionIds.add(qId); }); // 逐个处理每个问题 questionIds.forEach(qId => { // 获取当前问题左右选中选项的维度 const selectedLeft = $(`input[type='radio'][name='Left_${qId}']:checked`).attr('data-id'); const selectedRight = $(`input[type='radio'][name='Right_${qId}']:checked`).attr('data-id'); const selectedDimensions = new Set([selectedLeft, selectedRight]); // 给未选中的维度加2分 allDimensions.forEach(dim => { if (!selectedDimensions.has(dim)) { scores[dim] += 2; } }); // 叠加选中项的分数(原有逻辑保留) $(`input[type='radio'][name='Left_${qId}']:checked, input[type='radio'][name='Right_${qId}']:checked`).each(function() { scores[$(this).attr('data-id')] += Math.ceil($(this).val()); }); }); // 弹出结果 alert(`Networking: ${scores.Networking},\nRecognition: ${scores.Recognition},\nKnowledgeSeeking: ${scores.KnowledgeSeeking}`); });
关键细节说明
- 用
Set存储选中的维度,判断「是否未选中」的操作更高效 - 把分数存在对象里,后续扩展维度(比如加新的选项)会更方便
- 遍历每个问题组单独计算,确保每个未选中的维度在每个问题里都能加2分
测试你的示例场景
当两个问题都选中Recognition的Most Preferred(+3)和KnowledgeSeeking的Least Preferred(+1)时:
- Networking在每个问题里都未选中,两个问题共加
2*2=4分 - Recognition每个问题加3,两个问题共
3*2=6分 - KnowledgeSeeking每个问题加1,两个问题共
1*2=2分
结果完全符合你预期的Networking:4, Recognition:6, KnowledgeSeeking:2
另外提个小建议:你的HTML里有些data-id没加引号(比如Question2里的data-id=Recognition),虽然浏览器能兼容,但最好改成data-id="Recognition",保证语法规范哦~
内容的提问来源于stack exchange,提问作者harry
相关产品推荐
相关产品推荐

