如何对数组进行排序
var arr = new Array("word_12", "word_59", "word_17");
这样我就可以得到
["word_12", "word_17", "word_59"]
谢谢!
如何对数组进行排序
var arr = new Array("word_12", "word_59", "word_17");
这样我就可以得到
["word_12", "word_17", "word_59"]
谢谢!
您需要编写一个排序方法(可以使用任何您喜欢的方法),该方法将字符串在“_”处分割,并将第二部分用作数值排序值。
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"
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"]
parseInt
会将以0开头的字符串视为八进制,除非您提供适当的基数。只要数组只有一个值,["012"] - 6
最终会被转换为12 - 6
。您可以打开控制台并运行["012"] - 6
来查看输出结果。 - Sampson假设单词中包含数字和下划线(根据JavaScript单词定义,这些都是合法的单词字符):
arr.sort(function(_1, _2)
{
return +_1.substr(_1.lastIndexOf("_")+1)-_2.substr(_2.lastIndexOf("_")+1);
});
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"]
这被称为“自然排序”。