自然数组元素排序:带有数字的字符串
本文深入研究了对包含在 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