我正在寻找一种最简单的方法来对由数字和文本组成的数组以及它们的组合进行排序。
例如。
'123asd'
'19asd'
'12345asd'
'asd123'
'asd12'
变成了
'19asd'
'123asd'
'12345asd'
'asd12'
'asd123'
这将与another question I've asked here的解决方案结合使用。
排序函数本身是有效的,我需要的是一个可以说'19asd‘小于'123asd’的函数。
我正在用JavaScript写这篇文章。
编辑:正如adormitu所指出的,我正在寻找的是一个用于自然排序的函数
发布于 2018-10-10 03:53:21
如果你有一个对象数组,你可以这样做:
myArrayObjects = myArrayObjects.sort(function(a, b) {
return a.name.localeCompare(b.name, undefined, {
numeric: true,
sensitivity: 'base'
});
});
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);
发布于 2010-05-10 21:10:12
要比较值,可以使用比较方法:
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;
}
但是为了提高数组排序的速度,请在排序前调整数组,这样您只需执行一次小写转换和正则表达式,而不是在排序的每个步骤中执行一次。
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];
}
}
发布于 2019-02-21 12:11:58
到2019年为止,功能最全的库似乎是natural-orderby。
import { orderBy } from 'natural-orderby'
const unordered = [
'123asd',
'19asd',
'12345asd',
'asd123',
'asd12'
]
const ordered = orderBy(unordered)
// [ '19asd',
// '123asd',
// '12345asd',
// 'asd12',
// 'asd123' ]
它不仅接受字符串数组,还可以按对象数组中某个键的值进行排序。它还可以自动识别和排序字符串:货币、日期、货币和其他一堆东西。
令人惊讶的是,压缩后的大小也只有1.6kB。
https://stackoverflow.com/questions/2802341
复制相似问题