如何使用jQuery或JavaScript对对象数组进行排序

214

我有一个对象数组:

var array = [(id, name, value),(id, name, value)]; //and so on

我该如何按照属性名(array[i][1])升序排序数组?

我尝试过这样做:array[i][1].sort(),但是没有成功。

请帮忙!

编辑:数组中可能包含多于两个的对象!它可能包含数百个对象。

编辑: 为什么这个问题被标记为重复,当它是在“重复”的问题之前2年提出的?


1
你有一个二维数组还是一个对象数组?对我来说,上面看起来更像是一个对象数组。 - Chris Shouts
“{id,name,value}”不是有效的语法。 - Šime Vidas
@Sime 对不起,我当时记不得语法了。 - Karoline Brynildsen
@Chris 是的,当我想到它时,它实际上是一个对象数组。对不起,我在同时处理多个任务,有时会有点混淆。 - Karoline Brynildsen
1
关于您关于重复标记的问题:另一个问题是在2009年提出的,请参见http://stackoverflow.com/posts/979256/revisions。 - Markus
6个回答

405
//This will sort your array
function SortByName(a, b){
  var aName = a.name.toLowerCase();
  var bName = b.name.toLowerCase(); 
  return ((aName < bName) ? -1 : ((aName > bName) ? 1 : 0));
}

array.sort(SortByName);

5
已知在某些浏览器下会出现问题。我正在使用IE8进行一个项目,但它在这种情况下无法正常工作。 - Paolo del Mundo
1
@PaolodelMundo 我们有使用IE 7/8/9的用户。我们对这段代码没有任何问题。您能提供更多关于您的代码的信息吗? - Ketan
我该如何反转这个排序? - chovy
排序中使用toLowerCase的原因是什么? - Jacksonkr
7
对一个数组进行不区分大小写的排序。 - Ketan
显示剩余2条评论

38
var array = [[1, "grape", 42], [2, "fruit", 9]];

array.sort(function(a, b)
{
    // a and b will here be two objects from the array
    // thus a[1] and b[1] will equal the names

    // if they are equal, return 0 (no sorting)
    if (a[1] == b[1]) { return 0; }
    if (a[1] > b[1])
    {
        // if a should come after b, return 1
        return 1;
    }
    else
    {
        // if b should come after a, return -1
        return -1;
    }
});
sort 函数接受一个额外的参数,一个接受两个参数的函数。此函数应返回 -101 其中之一,具体取决于这两个参数在排序中谁应该排在前面。 更多信息
我还修复了您的多维数组中的语法错误。

30
//objects
var array = [{id:'12', name:'Smith', value:1},{id:'13', name:'Jones', value:2}];
array.sort(function(a, b){
    var a1= a.name.toLower(), b1= b.name.toLower();
    if(a1== b1) return 0;
    return a1> b1? 1: -1;
});

//arrays
var array =[ ['12', ,'Smith',1],['13', 'Jones',2]];
array.sort(function(a, b){
    var a1= a[1], b1= b[1];
    if(a1== b1) return 0;
    return a1> b1? 1: -1;
});

救命稻草!有没有办法使元素动态化?所以,“array.sort(function(a,b,element){ var a1= a.element, b1= b.element; ' and so on...” - SeaBass
看我的回答,你可以很容易地扩展它来做你所要求的@SeaBass。为了使动态参数方法起作用,您可能需要使用a[var]语法,但您不需要像上面的答案那样明确返回0。2-2=0。代码更少。同样的效果。 - Wes

21
data.sort(function(a,b) 
{
   return a.val - b.val;
});

11

JavaScript中的sort方法包含一个可选参数,用于传递自定义比较函数。

假设你想要一个数组的数组:

var arr = [[3, "Mike", 20],[5, "Alex", 15]];

function compareName(a, b)
{

  if (a[1] < b[1]) return -1;
  if (a[1] > b[1]) return 1;
  return 0;
}
arr.sort(compareName);
否则,如果你想要一个对象数组,你可以这样做:
function compareName(a, b)
{

  if (a.name < b.name) return -1;
  if (a.name > b.name) return 1;
  return 0;
}

3

看起来,你创建的并不是真正的多维数组,而是一个(几乎)JavaScript对象的数组。尝试像这样定义你的数组 ->

var array = [ [id,name,value], [id,name,value] ]

希望这能帮到你!

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