【问题标题】:How to check if there is any overlapping in array of range object using Joi如何使用 Joi 检查范围对象数组中是否有任何重叠
【发布时间】:2020-03-13 19:18:33
【问题描述】:

我有一个对象,其中一个键具有范围对象数组。

// this is valid object because startRank and endRank are not overlapping in all object
var object_1 = {
    "prizeDistribution": [
        {
            "startRank": 1,
            "endRank": 4,
            "value": 10
        },
        {
            "startRank": 4,
            "endRank": 11,
            "value": 7
        },
        {
            "startRank": 11,
            "endRank": 21,
            "value": 4
        },
        {
            "startRank": 21,
            "endRank": 51,
            "value": 2
        },
        {
            "startRank": 51,
            "endRank": 101,
            "value": 1
        }
    ]
}

// this is invalid object because startRank and endRank are overlapping
var object_2 = {
    "prizeDistribution": [
        {
            "startRank": 1,
            "endRank": 4,
            "value": 10
        },
        {
            "startRank": 3,
            "endRank": 11,
            "value": 7
        }
    ]
}

var schema = Joi.object({
    "prizeDistribution": Joi.array().items({
        "startRank": Joi.number().integer().required(),
        "endRank": Joi.number().integer().required(),
        "value": Joi.number().integer().required()                                         
    })
})

如何使用Joi 验证这样的范围对象数组?

【问题讨论】:

    标签: javascript json validation object joi


    【解决方案1】:

    小一点更好

    var schema = Joi.object({
          prizeDistribution: Joi.array()
            .items(
              Joi.object({
                startRank: Joi.number().integer().required(),
                endRank: Joi.number().integer().required(),
                value: Joi.number().integer().required()
              })
            ).unique((a, b) => (b.endRank > a.startRank) && (b.startRank < a.endRank))
        });
    

    【讨论】:

      【解决方案2】:

      您可以尝试通过Array.unique 签入 Joi 来实现此目的。如果数组项落在任何其他数组项的范围内,则基本上将其标记为重复。

      以下内容可能会有所帮助。

      var schema = Joi.object({
            prizeDistribution: Joi.array()
              .items(
                Joi.object({
                  startRank: Joi.number()
                    .integer()
                    .required(),
                  endRank: Joi.number()
                    .integer()
                    .required(),
                  value: Joi.number()
                    .integer()
                    .required()
                })
              )
              .unique((a, b) => {
                return (
                  (a.startRank > b.startRank && a.startRank < b.endRank) ||
                  (a.endRank > b.startRank && a.endRank < b.endRank)
                );
              })
          });
      

      Demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-29
        • 2021-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-30
        • 1970-01-01
        相关资源
        最近更新 更多