如何避免过多if判断,仅在参数存在时为对象添加属性?
如何在可选参数有值时才添加到MongoDB创建对象中?
我希望仅在参数有值时才将其添加到返回对象中,否则不传入该字段。用if判断可行,但可选参数多的时候太繁琐。代码里required: true的是必填项,还有部分可选参数,MongoDB作为NoSQL不需要的字段没必要存在,有没有更优方案?
MongoDB相关的原因是它是NoSQL数据库,可选字段并非必须存在。
我已尝试的方法
我曾尝试将不存在的项设为undefined,但无效,示例代码如下:
resolve: (_, { input: { createdBy, name, date, description, cost, link, weights, eventApplicants } }) => { return dbMutations.createEvent({ createdBy, name, date, description, cost: cost ? cost : undefined, link: link ? link : undefined, weights: weights && JSON.parse(weights), eventApplicants: eventApplicants && JSON.parse(eventApplicants) }) }
当前代码
核心看resolve函数,其余代码仅供参考:
createEvent: t.fieldWithInput({ input: { createdBy: t.input.field({ type: 'mongoId', required: true }), name: t.input.string({ required: true }), date: t.input.field({ type: 'Date', required: true }), description: t.input.string({ required: true }), cost: t.input.string(), link: t.input.string(), weights: t.input.string(), applicants: t.input.string(), }, type: 'mongoId', // @ts-ignore resolve: (_, { input: {createdBy, name, date, description, cost, link, weights, applicants} }) => { let parsedWeights let parsedApplicants if (weights) { parsedWeights = JSON.parse(weights) } if (applicants) { parsedApplicants = JSON.parse(applicants) } return dbMutations.createEvent({ createdBy, name, date, description, cost, link, weights: parsedWeights, applicants: parsedApplicants }) } })
解决方案
方案1:对象展开+过滤无效值
先构建包含所有字段的临时对象,再过滤掉undefined属性,适合字段较多的场景:
resolve: (_, { input: { createdBy, name, date, description, cost, link, weights, applicants } }) => { // 处理需要JSON解析的字段 const parsedFields = {} if (weights) parsedFields.weights = JSON.parse(weights) if (applicants) parsedFields.applicants = JSON.parse(applicants) // 合并所有字段 const rawEventData = { createdBy, name, date, description, cost, link, ...parsedFields } // 过滤掉值为undefined的属性 const filteredData = Object.fromEntries( Object.entries(rawEventData).filter(([_, value]) => value !== undefined) ) return dbMutations.createEvent(filteredData) }
方案2:动态构建目标对象
初始化必填字段后,逐个判断可选参数是否存在,存在则添加到对象中,逻辑直观清晰:
resolve: (_, { input: { createdBy, name, date, description, cost, link, weights, applicants } }) => { const eventData = { createdBy, name, date, description } // 添加无需转换的可选字段 if (cost) eventData.cost = cost if (link) eventData.link = link // 添加需要解析的字段 if (weights) eventData.weights = JSON.parse(weights) if (applicants) eventData.applicants = JSON.parse(applicants) return dbMutations.createEvent(eventData) }
方案3:封装工具函数复用逻辑
如果有大量需要处理的可选字段,封装工具函数可以减少重复代码,提升可维护性:
// 工具函数:给对象添加可选字段,支持自定义转换逻辑 const addOptionalField = (targetObj, fieldKey, fieldValue, transformFn) => { if (fieldValue !== undefined) { targetObj[fieldKey] = transformFn ? transformFn(fieldValue) : fieldValue } } resolve: (_, { input: { createdBy, name, date, description, cost, link, weights, applicants } }) => { const eventData = { createdBy, name, date, description } addOptionalField(eventData, 'cost', cost) addOptionalField(eventData, 'link', link) addOptionalField(eventData, 'weights', weights, JSON.parse) addOptionalField(eventData, 'applicants', applicants, JSON.parse) return dbMutations.createEvent(eventData) }
以上方案都能避免冗余的if判断,确保只有有值的字段才会传入MongoDB的创建方法,适配NoSQL数据库的特性。
内容的提问来源于stack exchange,提问作者Wayne
相关产品推荐
相关产品推荐

