Javascript 按升序排序数组
数组:Javascript 按升序排序数组,javascript,arrays,Javascript,Arrays,数组:var范围=[“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 知道如何获得所需的输出吗?如果要按第一个数字排序,方法是: var desire = ranges.sort(function(a,b){return parseInt(a)-parseInt(b)}); 说明:parseInt(a)只
var范围=[“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
知道如何获得所需的输出吗?如果要按第一个数字排序,方法是:
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 eval(a)-eval(b)});
说明:eval(a)
只计算表达式并传递结果
同样,您可以指定基数以避免不可预测的行为(例如,parseInt(a,10)
)。您的测试用例没有使用的一件事是以相同值开始但具有不同结束值的范围,例如:
[ "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()
函数调用带有两个参数的comparator函数,这两个参数是要比较的两个数组元素。此函数必须返回负值、正值或零值,以指示这两个元素的排序顺序
因此,我们分割每个范围以获得其起始值和结束值,然后简单地减去起始值。如果结果是非零,我们返回它,或者如果它是零,我们继续减去结束值并返回它
减去两个数值是生成此函数的负/零/正结果的简单方法。(请注意,任何负值或正值都可以。)作为一个很好的副作用,它还可以在减法之前将两个值转换为数字。这就是为什么代码不需要parseInt()
或类似的东西。还有一个无聊的答案:
var r=/^(\d+)-(\d+)$/;
变量范围=['3-5'、'1-4'、'0-9'、'10-10'];
范围.排序(函数(a,b){
a=a.匹配(r);
b=b.匹配(r);
a=Math.abs(a[1]-a[2]);
b=Math.abs(b[1]-b[2]);
返回b-a;
});
文件。写入(范围)代码>这里还有一个:
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"]
.sort()
方法可以传递一个比较器函数。String
比较不同于number
比较……请阅读此处:排序应该做什么,使用第一个数字作为数字来确定,或应用数学减法和排序?数字2<10
但字符串10<2
:“始终指定此参数以消除读卡器混淆并保证可预测的行为。。。通常默认值为10“thank@nicael不需要减法的结果,但无论如何还是要感谢你。它们只是范围而不是方程式。@h2o你有没有经历过这种不可预测的行为?@nicael:链接到的页面H2Ooooo对此进行了解释。特别是,“如果输入字符串以“0”开头,则基数为8(八进制)或10(十进制)。具体选择哪个基数取决于实现。ECMAScript 5指定使用10(十进制),但并非所有浏览器都支持这一点。”因此,在较旧的浏览器中,您可能会发现parseInt('031')
返回十进制25。@nicael:另外,请注意第二个示例中的。replace('-','')
调用。范围['11-12','1-200']
be sorted?还有:。@nicael我打赌你知道eval
是一个极具争议的问题-P@nicael不管怎样,你似乎喜欢争论;-)我完全是争论!你也可以用更复杂的表达;)
["0-9", "1-4", "3-5", "10-10"]