JavaScript中有没有更简洁的方式按条件替换指定对象的属性值?
解决方案
原生JavaScript实现
修改原对象的写法
把需要转换的属性统一放到数组中批量遍历处理即可,代码如下:
// 列出所有需要转布尔值的属性名 const booleanFields = ['extraBed', 'accomodateChildren', 'allowPets', 'isPrepaymentRequired', 'provideDormitoryForDriver', 'GST'] // 批量处理 booleanFields.forEach(field => { // 等价于你原有逻辑:等于"No"返回false,其他值返回true fields[field] = fields[field] !== 'No' })
不修改原对象,返回新对象的写法
const booleanFields = ['extraBed', 'accomodateChildren', 'allowPets', 'isPrepaymentRequired', 'provideDormitoryForDriver', 'GST'] const convertedFields = booleanFields.reduce((result, field) => { result[field] = result[field] !== 'No' return result }, {...fields})
Lodash实现
修改原对象
const booleanFields = ['extraBed', 'accomodateChildren', 'allowPets', 'isPrepaymentRequired', 'provideDormitoryForDriver', 'GST'] _.forEach(booleanFields, field => { fields[field] = fields[field] !== 'No' })
不修改原对象
const booleanFields = ['extraBed', 'accomodateChildren', 'allowPets', 'isPrepaymentRequired', 'provideDormitoryForDriver', 'GST'] const convertedFields = _.assign({}, fields, _.mapValues(_.pick(fields, booleanFields), val => val !== 'No'))
方案优势
- 完全符合需求:仅处理指定的属性,不会遍历对象所有属性,也不需要解构
- 符合DRY原则:后续需要新增/减少要转换的属性,只需要修改
booleanFields数组即可,不需要重复写转换逻辑 - 可灵活调整规则:如果后续规则调整为只有严格等于"Yes"才返回true,只需要把判断条件修改为
val === 'Yes'即可,改动量极小
内容的提问来源于stack exchange,提问作者Nithin K Joy
相关产品推荐
相关产品推荐

