如何在JavaScript中对数组进行排序

5

我不是使用关联数组。我使用这样的一维数组,

array("1,a","5,b","2,c","8,d","6,f");

我可以如何对这个数组进行排序?

结果应该是:

array("1,a","2,c","5,b","6,f","8,d");

你在使用.sort()时遇到了什么问题?你想要按数字先排序,然后按字母进行二次排序吗?还是只是对整个文本进行标准字符串排序?也就是说,你想如何对["1,a", "11,a", "2,b", "2,c"]进行排序? - nnnnnn
sort() 已经在运行了.. 我的代码有错误。 - Anish
可能是重复的问题:自然排序文本和数字,JavaScript - outis
9个回答

4

sort()没有使用自定义排序函数时,它会按您希望的方式进行排序(按字典顺序)。

>>> ["1,a","5,b","2,c","8,d","6,f"].sort();
["1,a", "2,c", "5,b", "6,f", "8,d"]

请注意,这将对原始数组进行排序。您可以使用 slice() 进行浅复制。
如果您的任何数字大于 9,并且希望按数字的序数进行排序,则需要自定义排序函数。
["1,a","5,b","2,c","8,d","6,f"].sort(function(a, b) {
    return parseInt(a, 10) - parseInt(b, 10);
});

2

3
+1,但我建议使用 MDN(https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)而不是 W3Schools。请查看此链接以了解原因:http://w3fools.com/ - nikc.org

1

试试这个

<script>
var abc=new Array("1,a","5,b","2,c","8,d","6,f");
document.write("<br/>");
document.write(abc.sort());
</script>

1

http://jsfiddle.net/Dht33/

var arrayVar = ["1,a","2,c","5,b","6,f","8,d"];

arrayVar.sort()

arrayVar; // "1,a","2,c","5,b","6,f","8,d"

1

尝试使用:

function sortNumber(a,b)
{
return (a.split(","))[0] - (b.split(","))[0] ;
}

var n = ["1,a","5,b","2,c","8,d","6,f"];
alert( n.sort(sortNumber) );

1

这是我的做法:

var arr1 = new Array("1,a","5,b","2,c","8,d","6,f");
var arr2 = arr1.sort( function(a, b){
    var ax = a.split(",");
    var bx = b.split(",");
    return ax[0]-bx[0];
});

document.getElementById("result").innerHTML = arr2.join(" : ");

1

你需要编写自己的比较函数来比较数字,否则默认的sort()会将像"40,a"这样的内容放在"5,b"之前。

这里有一个例子,它只是在,字符上进行拆分,并假设它前面的值是数字。我已经添加了"40,a"到示例中,以展示它正确地排序大于9的数字。

function mySort(a,b)
{
    return a.split(",", 1) - b.split(",", 1);
}

var theArray = ["1,a", "5,b", "2,c", "40,a", "8,d", "6,f"];
theArray.sort(mySort); // "1,a","2,c","5,b","6,f","8,d","40,a"

谢谢您的回复。我认为默认的sort()函数已经为我完成了工作。 - Anish

1

我假设您想首先按数字部分排序,进行数值排序,然后在逗号后面的位上进行第二个词典(字符串)排序。这样,像“11,a”这样的值将排在“2,a”之后 - 如果您只是进行默认排序,“11,a”将排在“2,a”之前。所以:

var a = ["1,a","11,a","8,a","24,z","5,b","2,c","8,d","6,f"];

a.sort(function(a,b) {
   var aparts = a.split(","),
       bparts = b.split(","),
       anum = +aparts[0], // convert first part to number
       bnum = +bparts[0],
       aletter = aparts[1],
       bletter = bparts[1];

   if (anum === bnum)
      return aletter < bletter ? -1 : aletter === bletter ? 0 : -1;
   else
      return anum - bnum;
});

结果:

["1,a", "2,c", "5,b", "6,f", "8,a", "8,d", "11,a", "24,z"]

太好了。我也遇到了类似的问题。我刚刚注意到,如果第二个元素相似,则无法正确排序。你的代码帮了我大忙。非常感谢。 - Anish
@Anish,Alex 处理得更加优雅... https://dev59.com/Yl7Va4cB1Zd3GeqPMLF_#8652418 - jondavidjohn
@jondavidjohn - 这可能更优雅,但它不等同于原文,因为它没有在字母部分包含二次排序。 - nnnnnn

0

试试这个:

<script type="text/javascript">
var testArray = new Array();
testArray[0] = '1';
testArray[1] = '5';
testArray[2] = '9';
testArray[3] = '8';
testArray[4] = '6';
testArray[5] = '2';
var getlength = testArray.length;
testArray.sort(function(a,b){return a - b});
for(var i=0; i<getlength;i++) {         
    alert(testArray[i]);
}
</script>

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