- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想根据预定义的正则表达式顺序对一组衣服尺码进行排序。
表达式数组如下所示:
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'
];
最佳答案
一个选项是遍历字符串,推送到由匹配的正则表达式索引的数组的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/
我对我接管的项目有疑问。我正在转换其他人编写的 MS Access 应用程序并将其转换为 MySQL/PHP Web 应用程序。其中大部分已经完成,但是,当涉及到此应用程序的调度部分时,我处于停滞状态
我有一个带有 @Scheduled 注释的方法。此方法包含长时间运行、昂贵的操作。我担心当计划的方法开始运行时应用程序会变慢。有什么办法可以为预定方法分配优先级吗?在 Spring 中启动低优先级后台
我的大学有一个预订项目房间的网站;但除非你很幸运或者半夜醒着,否则要订到房间并不容易。因此,我编写了一个 JS 片段来填写所有必要的字段并提交表单。 但是我如何自动化这个过程呢? 我的目的基本上是加载
我正在评估处理大量排队消息的可能解决方案,这些消息必须在特定日期和时间交付给工作人员。执行它们的结果主要是对存储数据的更新,它们最初可能是也可能不是由用户操作触发的。 例如,想想你在一个假设的大型星际
@Scheduled documentation here声明 fixedRateString值可以是 the delay in milliseconds as a String value, e.g
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 4年前关闭。 Improve t
我有一个有趣的情况。我解析了几个新闻发布网站,想通过调度程序将它们保存到数据库中。但是保存时出现错误。由于交易后写条件 described here . 我的模型类是 @Entity @Table(n
我正在阅读 Java Concurrency in Practice 并遇到以下代码片段。 public static void timedRun(final Runnable r,
使用 Azure 数据工厂,是否可以对驻留在 Azure SQL 数据库中的多个(不是全部)表中的所有行执行预定的 1:1 复制/克隆到另一个 Azure SQL 数据库(在本例中为 Azure SQ
我是一名优秀的程序员,十分优秀!