gpt4 book ai didi

javascript - 排序数组元素(带数字的字符串),自然排序

转载 作者:IT王子 更新时间:2023-10-29 03:01:35 31 4
gpt4 key购买 nike

我有一个类似的数组;

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

需要对其进行排序,使其看起来像;

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

我试过排序功能;

function compare(a,b) {
if (a < b)
return -1;
if (a > b)
return 1;
return 0;
}

但这给出了顺序

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

我试图想出一个可以工作但无法理解的正则表达式。
如果有帮助,格式将始终为 2 个字母、x 个数字,然后是任意数量的字符。

最佳答案

这称为“自然排序”,可以在 JS 中这样实现:

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

要倒序排序,只需交换参数:

test.sort(function(a, b) { return naturalCompare(b, a) })

或者只是

test = test.sort(naturalCompare).reverse();

关于javascript - 排序数组元素(带数字的字符串),自然排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15478954/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com