【问题标题】:Check dynamically if values are mandatory and then check if the mandatory values are null动态检查值是否为强制值,然后检查强制值是否为空
【发布时间】:2022-12-31 08:40:53
【问题描述】:

我有这个对象状态,我已将其初始化为初始段

当我设置每个字段 startDate、endDate 等的状态时,我创建了这个组件,并且在那里一切正常。

我想创建这个名为 validateSegement 的函数,它将是布尔值。如果此函数返回 true,则将启用添加段的按钮。

我已经创建了这个函数,但不幸的是它不是动态的。

问题是这些字段是由用户动态配置的,无论它们是否是强制性的。所以我想找到一种方法,首先检查字段是否为必填字段,然后检查必填字段是否为空。

我可以从后端的响应中找出这些字段是否是必填字段,对于这种情况,我假设响应是这样的:

【问题讨论】:

  • 请记住,Object ISegment 仍然是一个 Javascript 对象。因此,您应该能够遍历服务器定义的属性并检查每个字段是否真实。考虑遍历服务器定义键,如果 mandatory 为真,则查看 segment[key] 是否为真
  • @Todd 你能提供一个解决方案的例子吗?

标签: arrays json typescript react-native object


【解决方案1】:
type Segment = {
  id: string;
  startDate?: string;
  endDate?: string;
  startTime?: string;
  endTime?: string;
}

type MaybeOptionalField = keyof Omit<Segment, "id">

const configurations: Record<MaybeOptionalField, {mandatory: boolean, text: string}> = {
  startDate: {
    mandatory: true,
    text: "test"
  },
  endDate: {
    mandatory: false,
    text: "test"
  },
  startTime: {
    mandatory: false,
    text: "test"
  },
  endTime: {
    mandatory: false,
    text: "test"
  }
};

const segments: Segment[] = [{
    id: 'foo',
    startDate: "now",
}, {
    id: 'bar',
}]

// figure out which fields are currently required
const mandatoryFields = Object.entries(configurations)
    .filter(([_, configuration]) => configuration.mandatory)
    // Object.entries treats 'key' to always be type any string, but we'd like to maintain the keys as being of type MaybeOptionalField
    // which keeps `segment[mandatoryField]` as being valid, one could instead push the type assertion into the for loop below
    .map(([key]) => key as MaybeOptionalField)

const validateSegment = (segment: Segment) => {
  for (const mandatoryField of mandatoryFields) {
    if (!segment[mandatoryField]) {
      return false
    }
  }
  return true
};

const validSegments = segments.filter(segment => validateSegment(segment))
const invalidSegments = segments.filter(segment => !validateSegment(segment))

console.log(validSegments, validSegments.length)
console.log(invalidSegments, invalidSegments.length)

【讨论】:

    猜你喜欢
    • 2013-01-13
    • 2018-08-12
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 2021-08-17
    相关资源
    最近更新 更多