首页 >web前端 >js教程 >如何按自然顺序对包含数字的字符串数组进行排序?

如何按自然顺序对包含数字的字符串数组进行排序?

Barbara Streisand
Barbara Streisand原创
2024-11-17 19:18:01540浏览

How to Sort Arrays with Strings Containing Numbers in Natural Order?

自然数组元素排序:带有数字的字符串

本文深入研究了对包含在一个数组中组合字符串和数字的元素的数组进行排序的任务。自然顺序,在排序过程中应考虑字符串中的数字序列。

问题

考虑这样的数组:

["IL0 Foo", "PI0 Bar", "IL10 Baz", "IL3 Bob says hello"]

如果我们尝试使用传统的排序函数对这个数组进行排序,我们可能会得到不正确的顺序:

["IL0 Foo", "IL10 Baz", "IL3 Bob says hello", "PI0 Bar"]

解决方案:自然排序

为了实现自然排序,我们可以利用以下 JavaScript 函数:

function naturalCompare(a, b) {
    var ax = [], bx = [];

    a.replace(/(\d+)|(\D+)/g, function(_, , ) { ax.push([ || Infinity,  || ""]) });
    b.replace(/(\d+)|(\D+)/g, function(_, , ) { bx.push([ || Infinity,  || ""]) });
    
    while(ax.length && bx.length) {
        var an = ax.shift();
        var bn = bx.shift();
        var nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]);
        if(nn) return nn;
    }

    return ax.length - bx.length;
}

此函数将输入字符串标记为数字和非数字值的数组。然后,它按字典顺序比较数组,同时考虑整数值和字符串非数值值。

示例

将此函数应用于给定数组产生所需的自然排序顺序:

test = [
    "img12.png",
    "img10.png",
    "img2.png",
    "img1.png",
    "img101.png",
    "img101a.png",
    "abc10.jpg",
    "abc10",
    "abc2.jpg",
    "20.jpg",
    "20",
    "abc",
    "abc2",
    ""
];

test.sort(naturalCompare)
document.write("<pre class="brush:php;toolbar:false">" + JSON.stringify(test,0,3));

这会产生以下排序数组:

[
  "",
  "abc",
  "abc2",
  "abc10",
  "abc10.jpg",
  "20",
  "20.jpg",
  "img1.png",
  "img2.png",
  "img10.png",
  "img12.png",
  "img101.png",
  "img101a.png"
]

以上是如何按自然顺序对包含数字的字符串数组进行排序?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn