如何在逻辑处理中排除空值,仅将选中的星期复选框数据存入数据库
复选框提交空值过滤方案
现有代码存在的问题
- for...in 循环遍历对象时,拿到的
item是对象的属性名(字符串类型的monday、tuesday等),不是属性值,所以item.value永远为undefined,直接给item赋值也不会修改原对象的属性。 - 未选中的HTML复选框不会被浏览器提交到后端,所以
req.body中对应未选中项的属性本身就是undefined,只要属性有值就代表用户选中了该项。
修复代码逻辑
场景1:需要保留完整星期结构,未选中项设为false入库
var dates = { monday: req.body.monday, tuesday: req.body.tuesday, wednesday: req.body.wednesday, thursday: req.body.thursday, friday: req.body.friday, saturday: req.body.saturday, sunday: req.body.sunday } for (const key in dates) { // 双感叹号转布尔值:有值为true,无值为false dates[key] = !!dates[key] } // 处理后的dates可直接写入数据库
场景2:仅需要保留选中的有效项,过滤未选中项
var dates = { monday: req.body.monday, tuesday: req.body.tuesday, wednesday: req.body.wednesday, thursday: req.body.thursday, friday: req.body.friday, saturday: req.body.saturday, sunday: req.body.sunday } // 过滤后得到仅包含选中项的新对象 const selectedDates = Object.fromEntries( Object.entries(dates).filter(([_, value]) => value !== undefined) ) // 如果仅需要选中项对应的数值(1-7),直接生成数组即可 const selectedValues = Object.values(dates).filter(Boolean)
简化方案(推荐)
前端修改所有星期复选框的name属性为同一个值,后端可直接拿到选中项的数组,无需手动遍历过滤:
前端修改代码
<label for="sunday">Sunday</label> <input type="checkbox" id="sunday" name="week_days" value="1"> <label for="monday">Monday</label> <input type="checkbox" id="monday" name="week_days" value="2"> <label for="tuesday">Tuesday</label> <input type="checkbox" id="tuesday" name="week_days" value="3"> <label for="wednesday">Wednesday</label> <input type="checkbox" id="wednesday" name="week_days" value="4"> <label for="thursday">Thursday</label> <input type="checkbox" id="thursday" name="week_days" value="5"> <label for="friday">Friday</label> <input type="checkbox" id="friday" name="week_days" value="6"> <label for="saturday">Saturday</label> <input type="checkbox" id="saturday" name="week_days" value="7">
后端取值代码
// 未选中时为undefined,默认赋值为空数组;选中时为对应数值的数组 const selectedDays = req.body.week_days || []
内容的提问来源于stack exchange,提问作者developerg1000
相关产品推荐
相关产品推荐

