关于jquery:如何对对象的javascript数组进行数字排序,然后按字母顺序排序?

How can I sort a javascript array of objects numerically and then alphabetically?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Sorting objects in an array by a field value in JavaScript

如何按数字(按ID)排序对象数组,然后按字母(按名称)排序?

当前方式提供的输出无效。

这是我要整理的对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var items = [
    {
       "id": 165,
       "name":"a"
    },
    {
       "id": 236,
       "name":"c"
    },
    {
       "id": 376,
       "name":"b"
    },
    {
       "id": 253,
       "name":"f"
    },
    {
       "id": 235,
       "name":"e"
    },
    {
       "id": 24,
       "name":"d"
    },
    {
       "id": 26,
       "name":"d"
    }
]

我尝试的方式

1
2
3
4
5
items.sort(function(a, b) {
    return (a.id - b.id);
}).sort(function(a, b) {
    return (a.name - b.name);
});

这是J小提琴。

http://jsfiddle.net/jh4xb/

编辑:不好意思,这个问题让我困惑了一段时间。

我要做的是先按最高ID排序,然后按字母顺序排序,最后应该是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var items = [
    {
       "id": 376,
       "name":"b"
    },
    {
       "id": 253,
       "name":"f"
    },
    {
       "id": 236,
       "name":"c"
    },
    {
       "id": 235,
       "name":"e"
    },
    {
       "id": 165,
       "name":"a"
    },
    {
       "id": 26,
       "name":"d"
    },
    {
       "id": 24,
       "name":"d"
    }
]


我觉得最好是…

1
2
3
items.sort(function(a, b) {
  return a.id - b.id  ||  a.name.localeCompare(b.name);
});

第二类基本上会否定第一类,所以你必须做一次。)

a.id - b.id || a.name.localeCompare(b.name)表达式将首先比较ids;只有当它们相等时,它才会比较名称(并返回此比较的结果)。

如果您需要颠倒顺序,交换仓位(b.id - a.id等),或者完全否定:

1
2
3
items.sort(function(a, b) {
  return - ( a.id - b.id  ||  a.name.localeCompare(b.name) );
});

这里是JSfiddle(需要简化数据以显示我的观点)。


如果您的意思是希望它们按id排序,如果id匹配,则希望它们按name排序,然后使用此选项:

1
2
3
4
5
6
7
8
9
items.sort(function(a, b) {
    if (a.id !== b.id) {
        return a.id - b.id
    }
    if (a.name === b.name) {
      return 0;
    }
    return a.name > b.name ? 1 : -1;
});

否则你的问题就不清楚了。


创建一个常规函数,以便根据需要对其进行排序。检查下面的dynamicsort函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var items = [
{
"id": 165,
"name":"a"},
{
"id": 236,
"name":"b"},
{
"id": 376,
"name":"c"},
{
"id": 253,
"name":"d"},
{
"id": 235,
"name":"e"},
{
 "id": 24,
 "name":"f"}
];

function dynamicSort(property) {
   return function(a, b) {
       return (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
   }
}

items.sort(dynamicSort('name')).sort(dynamicSort('id'));
console.log(items);
items.sort(dynamicSort('id')).sort(dynamicSort('name'));
console.log(items);

你的问题是你如何整理信件。a.name - b.name

没有按你的想法去做。它不是按照词汇顺序来评价它们。用它代替

a.name < b.name ? -1 : 1;


我看不到Chrome中有任何错误,但排序不正确。

如果我将您的分类代码更改为:

1
2
3
4
5
6
7
8
var firstRun = items.sort(function(a, b) {
    return (a.id - b.id);
});
var secondRun = firstRun.sort(function(a, b) {
    return (a.name - b.name);
});

console.log(secondRun);?

我相信分类是正确的。您的示例并不需要进行第二次排序,因为每个数字(ID)都是不同的。但是当我把B,D和E都做了235号的身份证时,一切都很好。