按十进制和字符串排序数组 - Javascript

3

我需要使用纯粹的JavaScript对这种格式的数组进行排序。

var arr = ["0.01 BASIC", "0.01 SEF", "0.015 BASIC"];

我需要的是先按小数排序,然后按字符串排序,并产生与下面类似的输出结果;
arr = ["0.01 BASIC", "0.015 BASIC", "0.01 SEF"];

我不能使用jQuery来进行排序。只能使用纯粹的好老的JavaScript。


普通的JS有一个sort函数。在这里看看 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/sort - elclanrs
2
@elclanrs,“普通的JS有一个排序函数”是正确的,但它不能满足他指定的具有优先级的排序要求。 - Matthew Cox
1
@FeistyMango:当然可以,你只需要有创意并尝试一下。可能还有其他方法,但你可以使用“sort”来满足要求。 - elclanrs
@elclanrs 请看下面... - Matthew Cox
3个回答

6
你可以做到这一点:
arr.sort(function(a,b){
   var at = a.split(' '), bt = b.split(' ');
   if (at[1]!=bt[1]) return at[1]>bt[1] ? 1 : -1;
   return parseFloat(at[0])-parseFloat(bt[0]);
});

如果你想对一个非常大的数组进行排序,缓存键可能会更快。但对于大多数数组来说,这可能并不重要。
示例: 点击此处
["0.01 BASIC", "0.01 SEF", "0.015 BASIC", "0.2 BASIC", "0.001 SEF", "0.2 AAA"]
->
["0.2 AAA", "0.01 BASIC", "0.015 BASIC", "0.2 BASIC", "0.001 SEF", "0.01 SEF"] 

有了!使用 sort 的解决方案。不错。 - elclanrs
@elclanrs 哈哈,这与使用sort()函数实际上关系不大,而与dystroy实现核心功能有关。此时,sort()函数只是一个被吹嘘的for循环。 - Matthew Cox

1

连续进行两次排序即可:

arr.sort(function(a,b){
  // sort by words first
  return a.match(/[a-z]+/i).join("")<b.match(/[a-z]+/i).join()?-1:1;
}).sort(function(a,b){
  // sort by numbers next, but only if the words are equal
  return a.match(/[a-z]+/i).join("")!==b.match(/[a-z]+/i).join("")?0:parseInt(a)<parseInt(b)?-1:1;
})

1
我认为ECMAScript的排序不保证稳定。 - Denys Séguret
@dystroy 你具体是什么意思? - lordvlad
我的意思是第二个排序方式可以合法地完全删除第一个排序方式给出的顺序。 - Denys Séguret
这是不言而喻的,但我以为通过比较第二个排序中的字符串已经覆盖到了。 - lordvlad

1

使用简单的 JavascriptFIDDLE

    var xOriginal = ["0.01 BASIC", "0.015 BASIC", "0.01 SEF"];
    var xTemp = "";

for(var i=0;i<=xOriginal.length-1;i++)
{
for(var j=1;j<=xOriginal.length-1;j++)
{

 var xArr = xOriginal[i].split(" ");
 var yArr = xOriginal[j].split(" ");

  if((xArr[0] > yArr[0]) && (xArr[1] > yArr[1])) 
            {
               xTemp = xOriginal[i];
               xOriginal[i] = xOriginal[j];
               xOriginal[j] = xTemp;
            }


}
}

alert(xOriginal);

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