”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何按自然顺序对包含数字的字符串数组进行排序?

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

发布于2024-12-23
浏览:829

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

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

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

The问题

考虑这样的数组:

["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(_, $1, $2) { ax.push([$1 || Infinity, $2 || ""]) });
    b.replace(/(\d )|(\D )/g, function(_, $1, $2) { bx.push([$1 || Infinity, $2 || ""]) });
    
    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>"   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"
]
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3