首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Javascript :自然类型的字母数字字符串

Javascript :自然类型的字母数字字符串
EN

Stack Overflow用户
提问于 2010-05-10 19:52:13
回答 4查看 133K关注 0票数 224

我正在寻找一种最简单的方法来对由数字和文本组成的数组以及它们的组合进行排序。

例如。

代码语言:javascript
复制
'123asd'
'19asd'
'12345asd'
'asd123'
'asd12'

变成了

代码语言:javascript
复制
'19asd'
'123asd'
'12345asd'
'asd12'
'asd123'

这将与another question I've asked here的解决方案结合使用。

排序函数本身是有效的,我需要的是一个可以说'19asd‘小于'123asd’的函数。

我正在用JavaScript写这篇文章。

编辑:正如adormitu所指出的,我正在寻找的是一个用于自然排序的函数

EN

回答 4

Stack Overflow用户

发布于 2018-10-10 03:53:21

如果你有一个对象数组,你可以这样做:

代码语言:javascript
复制
myArrayObjects = myArrayObjects.sort(function(a, b) {
  return a.name.localeCompare(b.name, undefined, {
    numeric: true,
    sensitivity: 'base'
  });
});

代码语言:javascript
复制
var myArrayObjects = [{
    "id": 1,
    "name": "1 example"
  },
  {
    "id": 2,
    "name": "100 example"
  },
  {
    "id": 3,
    "name": "12 example"
  },
  {
    "id": 4,
    "name": "5 example"
  },

]

myArrayObjects = myArrayObjects.sort(function(a, b) {
  return a.name.localeCompare(b.name, undefined, {
    numeric: true,
    sensitivity: 'base'
  });
});
console.log(myArrayObjects);

票数 37
EN

Stack Overflow用户

发布于 2010-05-10 21:10:12

要比较值,可以使用比较方法:

代码语言:javascript
复制
function naturalSorter(as, bs){
    var a, b, a1, b1, i= 0, n, L,
    rx=/(\.\d+)|(\d+(\.\d+)?)|([^\d.]+)|(\.\D+)|(\.$)/g;
    if(as=== bs) return 0;
    a= as.toLowerCase().match(rx);
    b= bs.toLowerCase().match(rx);
    L= a.length;
    while(i<L){
        if(!b[i]) return 1;
        a1= a[i],
        b1= b[i++];
        if(a1!== b1){
            n= a1-b1;
            if(!isNaN(n)) return n;
            return a1>b1? 1:-1;
        }
    }
    return b[i]? -1:0;
}

但是为了提高数组排序的速度,请在排序前调整数组,这样您只需执行一次小写转换和正则表达式,而不是在排序的每个步骤中执行一次。

代码语言:javascript
复制
function naturalSort(ar, index){
    var L= ar.length, i, who, next, 
    isi= typeof index== 'number', 
    rx=  /(\.\d+)|(\d+(\.\d+)?)|([^\d.]+)|(\.(\D+|$))/g;
    function nSort(aa, bb){
        var a= aa[0], b= bb[0], a1, b1, i= 0, n, L= a.length;
        while(i<L){
            if(!b[i]) return 1;
            a1= a[i];
            b1= b[i++];
            if(a1!== b1){
                n= a1-b1;
                if(!isNaN(n)) return n;
                return a1>b1? 1: -1;
            }
        }
        return b[i]!= undefined? -1: 0;
    }
    for(i= 0; i<L; i++){
        who= ar[i];
        next= isi? ar[i][index] || '': who;
        ar[i]= [String(next).toLowerCase().match(rx), who];
    }
    ar.sort(nSort);
    for(i= 0; i<L; i++){
        ar[i]= ar[i][1];
    }
}
票数 23
EN

Stack Overflow用户

发布于 2019-02-21 12:11:58

到2019年为止,功能最全的库似乎是natural-orderby

代码语言:javascript
复制
import { orderBy } from 'natural-orderby'

const unordered = [
  '123asd',
  '19asd',
  '12345asd',
  'asd123',
  'asd12'
]

const ordered = orderBy(unordered)

// [ '19asd',
//   '123asd',
//   '12345asd',
//   'asd12',
//   'asd123' ]

它不仅接受字符串数组,还可以按对象数组中某个键的值进行排序。它还可以自动识别和排序字符串:货币、日期、货币和其他一堆东西。

令人惊讶的是,压缩后的大小也只有1.6kB。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2802341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档