2013-04-09 109 views
3

我需要使用普通的旧Javascript对这种格式的数组进行排序。按字符串排序数组然后按字符串 - Javascript

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

我需要的是用于阵列要由十进制第一排序然后通过串并产生一个输出,就像下面;

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

我无法使用jquery进行排序。只是简单的老的Javascript。

+0

平原老JS有一个'sort'功能。看看这里https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/sort – elclanrs 2013-04-09 06:47:20

+2

@elclanrs'简单的老JS有一个排序函数'true,但它不会满足要求他指定优先排序。 – 2013-04-09 06:48:28

+1

@FeistyMango:当然你可以,你只需要有创意并尝试一下。可能还有其他方法,但是您可以使用'sort'来满足要求。 – elclanrs 2013-04-09 06:54:19

回答

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]); 
}); 

如果要排序的一个非常大的阵列,它可能会更快缓存键。但对于大多数阵列来说可能并不重要。

Example

["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"] 
+0

很好地完成。打我吧= P – 2013-04-09 06:55:37

+0

有!一个使用'sort'的解决方案。尼斯。 – elclanrs 2013-04-09 06:55:42

+0

@elclanrs哈哈,这与使用sort()函数以及所有与执行肉和土豆相关的操作确实很少有关。 sort()函数在这一点上只是一个荣耀的循环。 – 2013-04-09 06:57:03

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的排序是保证稳定。 – 2013-04-09 06:56:59

+0

@dystroy究竟是什么意思? – lordvlad 2013-04-09 06:58:59

+0

我的意思是第二种排序可以合法地完全删除第一个排序。 – 2013-04-09 06:59:51

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);