使用单词_数字值对JavaScript数组进行排序

3

如何对数组进行排序

var arr = new Array("word_12", "word_59", "word_17");

这样我就可以得到

["word_12", "word_17", "word_59"]

谢谢!

4个回答

4

您需要编写一个排序方法(可以使用任何您喜欢的方法),该方法将字符串在“_”处分割,并将第二部分用作数值排序值。

function sortOnNum(a,b){
         //you'll probably want to add a test to make sure the values have a "_" in them and that the second part IS a number, and strip leading zeros, if these are possible
         return (a.split("_")[1] * 1 > b.split("_")[1] * 1)? 1:-1;// I assume the == case is irrelevant, if not, modify the method to return 0 for ==
    }

    var ar = new Array ("foo_1", "foo_19", "foo_3", "foo_1002");

ar.sort(sortOnNum); //here you pass in your sorting function and it will use the values in the array against the arguments a and b in the function above

alert(ar); // this alerts "foo_1,foo_3,foo_19,foo_1002"

这是一个JSFiddle示例: http://jsfiddle.net/eUvbx/1/, 涉及IT技术。

2
虽然布尔值在排序方法中有一定的成功率,但正确的响应是一个正数、负数或0。我以前也使用布尔值,直到被指出为止 ;) - Sampson
@JonathanSampson:在“正确响应”链接中,有一个断言,即在字典顺序中,80排在9之前,但没有解释为什么?链接http://oeis.org/wiki/Orderings#Lexicographic_order显示相反的结果。 - user1054134
@Jonathan Sampson,我意识到我需要对键值对进行排序。你能否查看一下我的问题(https://dev59.com/Nmgu5IYBdhLWcg3w9ruX#10946984)? - user1054134

2
以下假设您的数字始终位于字符串的末尾。请注意,我已将一些其他示例添加到数组中以演示此方法可以使用的不同格式:
var numbers = ["word_12", "word_59", "word_17", "word23", "28", "I am 29"];

numbers.sort(function(a,b){
    return a.match(/\d+$/) - b.match(/\d+$/);
});

导致的结果是:
["word_12", "word_17", "word23", "28", "I am 29", "word_59"]

@Jonathan,这个不会出现在“word”部分中出现数字的风险吗? - Yevgeny Simkin
@Dr.Dredel,您所说的数字前缀是什么意思? - Sampson
@JonathanSampson,如果是03或类似的版本 - Yevgeny Simkin
@JonathanSampson,我想我不太清楚解释器在面对需要将字符串转换为数字以进行减法运算时会做什么。parseInt将以0开头的数字视为八进制数,我确信只需要花一点时间运行测试就可以看到它是如何工作的,但我更喜欢推测并感到有些困惑。 - Yevgeny Simkin
@Dr.Dredel parseInt会将以0开头的字符串视为八进制,除非您提供适当的基数。只要数组只有一个值,["012"] - 6最终会被转换为12 - 6。您可以打开控制台并运行["012"] - 6来查看输出结果。 - Sampson
显示剩余2条评论

0

假设单词中包含数字和下划线(根据JavaScript单词定义,这些都是合法的单词字符):

arr.sort(function(_1, _2)
{
    return +_1.substr(_1.lastIndexOf("_")+1)-_2.substr(_2.lastIndexOf("_")+1);
});

0
这是通用情况下的代码:
natcmp = function(a, b) {
    var aa = [], bb = [];

    (a + "").replace(/(\d+)|(\D+)/g, function($0, $1, $2) { aa.push($2 || Number($1)) });
    (b + "").replace(/(\d+)|(\D+)/g, function($0, $1, $2) { bb.push($2 || Number($1)) })

    var la = aa.length, lb = bb.length;

    for (var i = 0; i < Math.max(la, lb); i++) {
        if (i >= lb) return 1;
        if (i >= la) return -1;
        if (aa[i] > bb[i]) return 1;
        if (aa[i] < bb[i]) return -1;
    }

    return 0;
}

例子:

var x = ["word_12", "word_59", "ford_1a", "ford_12a", "ford_2a", "word_0", "word_"];
x.sort(natcmp)

# ["ford_1a", "ford_2a", "ford_12a", "word_", "word_0", "word_12", "word_59"]

这被称为“自然排序”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接