数组:var ranges = ["3-5", "1-4", "0-9", "10-10"];
我尝试了以下功能:
ranges.sort();
// Output: 0-9,1-4,10-10,3-5
// Desired output: 0-9,1-4,3-5,10-10
知道如何获得所需的输出吗?
答案 0 :(得分:4)
如果您想按第一个数字排序,方法是:
var desire = ranges.sort(function(a,b){return parseInt(a)-parseInt(b)});
说明:parseInt(a)
只删除非数字后面的所有内容,即-
并返回数字。
如果您的范围以相同的数字开头(例如3-5
和3-7
),您还希望使其按第一个数字排序:
var desire = ranges.sort(function(a,b){
return (c=parseInt(a)-parseInt(b))?c:a.split('-')[1]-b.split('-')[1]
});
说明:在第一个数字相等之前作为第一个;然后它检查第二个数字(感谢Michael Geary的想法!)
如果您想按等式的结果排序,请转到
var desire = ranges.sort(function(a,b){return eval(a)-eval(b)});
说明:eval(a)
只计算表达式并传递结果。
此外,作为mentioned by h2ooooooo,您可以指定基数以避免不可预测的行为(即parseInt(a, 10)
)。
答案 1 :(得分:2)
您的测试用例不能运用的一个范围是以相同值开头但具有不同结束值的范围,例如:
[ "3-5", "1-5", "1-4", "10-9", "0-9", "10-10" ];
据推测,您希望按此顺序排序:
[ "0-9", "1-4", "1-5", "3-5", "10-9", "10-10" ]
这是一个排序函数,按每个范围的开头排序,其次是每个范围的结尾。因此,如果两个范围以相同的值开头,则先前结束的范围将首先排序。
function sortRanges( range ) {
return ranges.sort( function( a, b ) {
var aSplit = a.split( '-' ), aStart = aSplit[0], aEnd = aSplit[1];
var bSplit = b.split( '-' ), bStart = bSplit[0], bEnd = bSplit[1];
return aStart - bStart ? aStart - bStart : aEnd - bEnd;
});
}
var ranges = [ "3-5", "1-5", "1-4", "10-9", "0-9", "10-10" ];
console.log( sortRanges( ranges ) );
这会记录上面的结果。
工作原理:sort()
函数调用带有两个参数的比较器函数,这两个参数是要比较的两个数组元素。此函数必须返回负值,正值或零值,以指示这两个元素的排序顺序。
因此,我们将每个范围拆分以获取其开始值和结束值,然后简单地减去起始值。如果结果非零,我们返回它,或者如果它为零,我们继续减去结束值并返回。
减去两个数值是生成此函数的负/零/正结果的简便方法。 (注意任何负值或正值都可以。)作为一个很好的副作用,它还会在减法之前将两个值都转换为数字。这就是为什么代码不需要parseInt()
或类似的东西。
答案 2 :(得分:2)
一个更无聊的答案:
var r = /^(\d+)-(\d+)$/;
var ranges = ['3-5', '1-4', '0-9', '10-10'];
ranges.sort(function (a, b) {
a = a.match(r);
b = b.match(r);
a = Math.abs(a[1] - a[2]);
b = Math.abs(b[1] - b[2]);
return b - a;
});
document.write(ranges);

答案 3 :(得分:2)
还有一个:
var ranges = ["3-5", "1-4", "0-9", "10-10"];
ranges.sort(function(a, b) {
return a.split('-')[0] - b.split('-')[0];
});
console.log(ranges);
输出:
["0-9", "1-4", "3-5", "10-10"]