如何按字母顺序对javascript数组进行排序,然后按字母顺序排序?

时间:2012-10-15 16:37:05

标签: javascript jquery arrays sorting

  

可能重复:
  Sorting objects in an array by a field value in JavaScript

如何按字母顺序(按名称)按字母顺序(按名称)对对象数组进行排序?

目前的方式是提供无效输出。

这是我试图排序的对象

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"
    }
]

以及我试图排序的方式

items.sort(function(a, b) {
    return (a.id - b.id);
}).sort(function(a, b) {
    return (a.name - b.name);
});

这是jsfiddle。

http://jsfiddle.net/jh4xb/

编辑:很抱歉这个混乱,我已经对这个问题感到困惑了一段时间。

我想要完成的是先按最高ID排序,然后按字母顺序排序,最后看起来像:

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"
    }
]

5 个答案:

答案 0 :(得分:45)

我认为最好只用... ...

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

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

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

如果你需要改变顺序,交换位置(b.id - a.id等) - 或者只是否定整个事情:

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

这是JSFiddle(必须简化数据以显示我的观点)。

答案 1 :(得分:6)

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

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

否则你的问题不清楚。

答案 2 :(得分:4)

创建一个通用函数,无论如何都要对它进行排序。检查下面的dynamicSort函数

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

答案 3 :(得分:0)

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

如果我将您的排序代码更改为:

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的ID都是235,它排序很好。

答案 4 :(得分:0)

你的问题是你如何整理这些字母 a.name - b.name

没有按你的想法行事。它不是以lexigraphical顺序评估它们。 用

替换它

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