You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免过多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 14:50:31