Javascript:自然的字母数字字符串

2022-08-30 00:32:15

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

例如:

'123asd'
'19asd'
'12345asd'
'asd123'
'asd12'

变成

'19asd'
'123asd'
'12345asd'
'asd12'
'asd123'

这将与我在这里提出的另一个问题的解决方案结合使用。

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

我是用JavaScript写的。

编辑:正如adormitu所指出的,我正在寻找的是自然排序的功能


答案 1

现在,在使用 localeCompare 的现代浏览器中,这成为可能。通过传递该选项,它将智能地识别数字。您可以使用 执行不区分大小写的操作。在 Chrome、Firefox 和 IE11 中进行了测试。numeric: truesensitivity: 'base'

下面是一个示例。它返回,表示 10 在 2 之后:1

'10'.localeCompare('2', undefined, {numeric: true, sensitivity: 'base'})

为了在对大量字符串进行排序时提高性能,文章说:

在比较大量字符串时(例如对大型数组进行排序),最好创建一个 Intl.Collator 对象并使用其 compare 属性提供的函数。文档链接

var collator = new Intl.Collator(undefined, {numeric: true, sensitivity: 'base'});
var myArray = ['1_Document', '11_Document', '2_Document'];
console.log(myArray.sort(collator.compare));

答案 2

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

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);