文件名排序算法分析

要解决的问题

用户在上传海量图片的时候,我们希望提供能够根据图片文件名进行正序/逆序排序的功能。

但是,传统的localeCompare方法,在面对包含数字和字符的字符串数组的排序时,会遇到如下问题:

var source = ['0509_1.jpg', '0509_2.jpg', '0509_11.jpg']

经过localeCompare()排序后,会变成

var result = ['0509_1.jpg', '0509_11.jpg', '0509_2.jpg']

显然这不是我们想要的结果

natsort库分析

幸运地,我们在github上找到一个成熟的排序库natsort

该算法中,最重要的就在于正则表达式的构建,才能准确地将数字从字符串中识别并分离出来。

下面我们分析一下它的源码,一起学习一下如何正确地比较两个字符串的大小。

Step1: 去掉空格

var tre = /^\s+|\s+$/g

function replaceWhiteSpace (s) {
  return ('' + s).replace(tre, '');
}

Step2: 将包含的数字部分进行拆分

var nre = /(0x[\da-fA-F]+|(^[\+\-]?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?(?=\D|\s|$))|\d+)/g

function splitString (s) {
  return s.replace(nre, '\0$1\0')
          .replace(/\0$/, '')
          .replace(/^\0/, '')
          .split('\0')
}

Step3: 判断是否为Hex或者日期

var hre = /^0x[0-9a-f]+$/i

function parseHex (s) {
  return parseInt(s.match(hre), 16) || null
}

var dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/

function parseDatetime (s) {
  return s.match(dre) && Date.parse(s) || null
}

Step4: 对已拆分的两个数组进行比较

代码就不贴出来了,大概的思路就是:

  1. 遍历两个数组,对其中的数字转换为字符串;
  2. 对转换出来的字符串使用localeCompare进行比较;

用法

参见natsort

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,681评论 0 4
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 9,711评论 0 13
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 9,961评论 0 5
  • 2006年,罗宾逊在TED做了一场《学校正在扼杀创造力》的演讲,当TED把这个演讲视频放到网上之后,它迅速窜至演讲...
    小曲是我阅读 5,736评论 0 1
  • 当家女孩(十七) 文/老桥 刘军知道哥哥和玲子生气,也没阻拦,回家呆几天也好,看看玲子啥反应。 玲子认为哥哥只是...
    老桥1阅读 1,013评论 0 0

友情链接更多精彩内容