Я хочу отсортировать массив размеров одежды на основе предварительно определенного порядка регулярных выражений.
Массив выражений выглядит так:
const sizeOrder = [
/One Size/,
/[X/S]+S/i,
/^S$/i,
/^M$/i,
/^L$/i,
/[X]+L/i,
/[4-9]XL/i,
/[0-9,]+/,
];
Какой был бы аккуратный и эффективный способ сортировки массива, который, например, выглядел бы так:
const sizes = [
'45,5',
'S',
'XXS',
'XXL',
'XS',
'4XL',
'One Size',
'0',
'32',
'42,5',
'18',
'XXS/XS',
'XXXS',
'L'
];
В качестве первого шага я бы создал сегменты для соответствующих регулярных выражений, и если совпадение существует, я помещаю это значение в сегмент, например, так:
function exampleSort() {
const bucket = Array.from(new Array(sizeOrder.length), () => []);
sizes.forEach(size => {
const i = sizeOrder.findIndex(order => order.test(size));
if (i > -1) {
bucket[i].push(size);
}
});
}
После этого я бы просматривал каждое ведро и сортировал их соответствующим образом, а затем соединял эти массивы в одно.
Но у меня есть два вопроса:
А как насчет особого случая XXS/XS
? Как бы я отсортировал это ведро так, чтобы XXS/XS
было между XXS
и XS
?
Кажется, это обязательная и наивная реализация. Есть ли другой способ сделать это более эффективно?
Это мой ожидаемый результат:
const sorted = [
'One Size',
'XXXS',
'XXS',
'XXS/XS',
'XS',
'S',
'L',
'XXL',
'4XL',
'0',
'18',
'32',
'42,5',
'45,5'
];