Joi проверить порядок массива

Я просмотрел API-интерфейсы Joi, но нет такой вещи, как порядок массива. Я также изучал Joi refs, но в настоящее время невозможно (поправьте меня, если я ошибаюсь) использовать их внутри массивов.

Я думаю об использовании extend, но не уверен, что можно получить весь массив.

Вход:

const asc = [1,2,3];
const noOrder = [10,7,8];
const desc = [6,5,4];

Желаемый результат:

Joi.validate(asc, Joi.array().asc()) // True
Joi.validate(asc, Joi.array().desc()) // False
Joi.validate(desc, Joi.array().desc()) // False
Joi.validate(noOrder, Joi.array().desc()) // False
Joi.validate(noOrder, Joi.array().asc()) // True

Итак, мой вопрос: как мне начать с этим? Любая идея приветствуется

Вы пробовали массив.упорядоченный

Code Maniac 13.04.2019 04:55

@CodeManiac проблема в том, что длина массива является переменной

Brian Le 13.04.2019 05:15

я думаю, вы можете расширить что-то похожее на то, как работает значение массив.уникальный и функция

Code Maniac 13.04.2019 05:23

@CodeManiac, возможно, что-то вроде Joi.array().unique((a,b) => a <= b)?

Brian Le 13.04.2019 05:35
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
872
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Joi не предлагает никаких встроенных способов проверки порядка массива, поэтому вам придется extend использовать собственное расширение, например:

const Joi = require('joi');

const customJoi = Joi.extend((joi) => ({
  base: joi.array(),
  name: 'array',
  language: {
      asc: 'needs to be sorted in ascending order',
      desc: 'needs to be sorted in descending order'
  },

  rules: [
      {
          name: 'asc',        
          validate(params, value, state, options) { 
            const isAscOrder = value.every((x, i) => i === 0 || x >= value[i - 1]);
            return isAscOrder ? value : this.createError('array.asc', {v: value}, state, options);             
          }
      },
      {
          name: 'desc',          
          validate(params, value, state, options) {
            const isDescOrder = value.every((x, i) => i === 0 || x <= value[i - 1]);
            return isDescOrder ? value : this.createError('array.desc', {v: value}, state, options);             
          }
      }
  ]
}));

const ascSchema = customJoi.array().asc();
const descSchema = customJoi.array().desc();

// Validation results.
console.info(Joi.validate([5, 7, 9, 10], ascSchema)); //true
console.info('\n\n');
console.info(Joi.validate([5, 7, 6, 10], ascSchema)); //false
console.info('\n\n');
console.info(Joi.validate([5, 4, 2, 0], descSchema)); //true
console.info('\n\n');
console.info(Joi.validate([5, 4, 2, 6], descSchema)); //false

Здравствуйте и спасибо за ответ. Быстрый вопрос: будет ли более эффективно использовать forEach(), чем createError, чем every? Или даже цикл for?

Brian Le 13.04.2019 15:10

Пожалуйста. Every прекратит проверку элементов массива, как только найдет один элемент, не удовлетворяющий условию. Вы можете добиться такого же поведения с помощью цикла foreach и for, но вам придется явно разорвать цикл, поэтому решение будет намного более подробным. Еще одна хорошая вещь в every заключается в том, что передаваемая функция обычно является чистой функцией без побочных эффектов. Вы можете узнать больше о разнице между каждым методом массива здесь: stackoverflow.com/questions/7340893/…

f-CJ 13.04.2019 15:20

Спасибо за полезную ссылку. Принял ответ

Brian Le 13.04.2019 15:23

Привет @BrianLe! Увидимся.

f-CJ 13.04.2019 15:29

Начиная с версии 16.0.0, Joi поддерживает проверку порядка массива по следующей схеме:

Joi.array()
    .items(Joi.number())
    .sort({ order: 'ascending' });

Другие вопросы по теме