Я просмотрел 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
Итак, мой вопрос: как мне начать с этим? Любая идея приветствуется
@CodeManiac проблема в том, что длина массива является переменной
я думаю, вы можете расширить что-то похожее на то, как работает значение массив.уникальный и функция
@CodeManiac, возможно, что-то вроде Joi.array().unique((a,b) => a <= b)?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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?
Пожалуйста. Every прекратит проверку элементов массива, как только найдет один элемент, не удовлетворяющий условию. Вы можете добиться такого же поведения с помощью цикла foreach и for, но вам придется явно разорвать цикл, поэтому решение будет намного более подробным. Еще одна хорошая вещь в every заключается в том, что передаваемая функция обычно является чистой функцией без побочных эффектов. Вы можете узнать больше о разнице между каждым методом массива здесь: stackoverflow.com/questions/7340893/…
Спасибо за полезную ссылку. Принял ответ
Привет @BrianLe! Увидимся.
Начиная с версии 16.0.0, Joi поддерживает проверку порядка массива по следующей схеме:
Joi.array()
.items(Joi.number())
.sort({ order: 'ascending' });
Вы пробовали массив.упорядоченный