首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按升序排序数组

按升序排序数组
EN

Stack Overflow用户
提问于 2015-12-23 19:15:16
回答 4查看 205关注 0票数 4

阵列:var ranges = ["3-5", "1-4", "0-9", "10-10"];

我尝试了以下功能:

代码语言:javascript
运行
复制
ranges.sort();

// Output: 0-9,1-4,10-10,3-5

// Desired output: 0-9,1-4,3-5,10-10

知道我怎样才能得到想要的输出吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-12-23 19:22:11

如果您想按第一个数字进行排序,方法是:

代码语言:javascript
运行
复制
var desire = ranges.sort(function(a,b){return parseInt(a)-parseInt(b)});

说明:parseInt(a)只是在非数字之后删除所有内容,即-并返回数字。

如果您还想正确地按第一个数字排序,如果您的范围以相同的数字(即3-53-7)开头:

代码语言:javascript
运行
复制
var desire = ranges.sort(function(a,b){
   return (c=parseInt(a)-parseInt(b))?c:a.split('-')[1]-b.split('-')[1]
});

说明:作为第一个数字工作,直到第一个数字相等;然后它检查第二个数字(谢谢Michael Geary的想法!)

如果您想按方程的结果排序,请选择

代码语言:javascript
运行
复制
var desire = ranges.sort(function(a,b){return eval(a)-eval(b)});

说明:eval(a)只是计算表达式并传递结果。

此外,作为mentioned by h2ooooooo,您可以指定基以避免不可预测的行为(即parseInt(a, 10))。

票数 4
EN

Stack Overflow用户

发布于 2015-12-23 19:31:32

您的测试用例没有使用的一件事是,以相同值开头但具有不同的结束值的范围,例如:

代码语言:javascript
运行
复制
[ "3-5", "1-5", "1-4", "10-9", "0-9", "10-10" ];

想必您希望按照以下顺序排序:

代码语言:javascript
运行
复制
[ "0-9", "1-4", "1-5", "3-5", "10-9", "10-10" ]

这里有一个排序函数,它按每个范围的开始排序,然后在每个范围的末尾排序。因此,如果两个范围以相同的值开头,则前面结束的范围将首先排序。

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2015-12-23 19:47:40

还有一个无聊的答案:

代码语言:javascript
运行
复制
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);

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34442270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档