gpt4 book ai didi

JavaScript:基于预定义的正则表达式顺序进行排序的算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:39:42 27 4
gpt4 key购买 nike

我想根据预定义的正则表达式顺序对一组衣服尺码进行排序。

表达式数组如下所示:

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 位于 XXSXS 之间?

这似乎是一个命令式的、天真的实现。有没有其他方法可以更有效地做到这一点?

这是我的预期输出:

const sorted = [
'One Size',
'XXXS',
'XXS',
'XXS/XS',
'XS',
'S',
'L',
'XXL',
'4XL',
'0',
'18',
'32',
'42,5',
'45,5'
];

最佳答案

一个选项是遍历字符串,推送到由匹配的正则表达式索引的数组的Map。然后,对每个数组进行排序,并展平得到结果。

请注意添加 ^$ anchor 以确保只有完全匹配才能满足 .test

const sizeOrder = [
/^One Size$/,
/^[X/S]+S$/i,
/^S$/i,
/^M$/i,
/^L$/i,
/^[X]+L$/i,
/^[4-9]XL$/i,
/^[0-9,]+$/,
];
const patternMap = new Map(sizeOrder.map(pattern => [pattern, []]));
const sizes = [
'45,5',
'S',
'XXS',
'XXL',
'XS',
'4XL',
'One Size',
'0',
'32',
'42,5',
'18',
'XXS/XS',
'XXXS',
'L'
];
sizes.forEach((str) => {
const matchingPattern = sizeOrder.find(pattern => pattern.test(str));
patternMap.get(matchingPattern).push(str);
});
const valuesArr = [...patternMap.values()];
valuesArr.forEach(arr => arr.sort((a, b) => b.localeCompare(a)));
// sort the last one from /^[0-9,]+$/ differently:
valuesArr[valuesArr.length - 1].sort();
console.log(valuesArr.flat());

或者,使用一组模式和一个可选的关联排序函数,您可以执行如下操作:

const sizeOrder = [
{ pattern: /^One Size$/ },
{ pattern: /^[X/S]+S$/i, }, // insert your custom sort logic for XXS/XS here
{ pattern: /^S$/i },
{ pattern: /^M$/i },
{ pattern: /^L$/i },
{ pattern: /^[X]+L$/i },
{ pattern: /^[4-9]XL$/i },
{ pattern: /^[0-9,]+$/, sort: arr => arr.sort() }
];
const patternMap = new Map(sizeOrder.map(({ pattern }) => [pattern, []]));
const sizes = [
'45,5',
'S',
'XXS',
'XXL',
'XS',
'4XL',
'One Size',
'0',
'32',
'42,5',
'18',
'XXS/XS',
'XXXS',
'L'
];
sizes.forEach((str) => {
const { pattern } = sizeOrder.find(({ pattern }) => pattern.test(str));
patternMap.get(pattern).push(str);
});
const valuesArr = [...patternMap.values()];
valuesArr.forEach((arr, i) => {
const sort = sizeOrder[i].sort;
if (sort) {
sort(arr);
} else {
arr.sort((a, b) => b.localeCompare(a));
}
});
console.log(valuesArr.flat());

关于JavaScript:基于预定义的正则表达式顺序进行排序的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54110162/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com