2012-10-15 197 views
18

可能重复:
Sorting objects in an array by a field value in JavaScript如何以数字方式对字符串数组进行排序然后按字母顺序排序?

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

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

这是我试图通过

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

的dynamicSort功能可能需要您要尝试如何在这个例子中,因为完成,通过'id'排序第一是没有意义的,因为所有的'id's和'一个更好的例子名字是独一无二的。这相当于按“name”排序。 – Bill

+0

同意 - 你想要什么样的订购语义在这里? – Pointy

+2

不知道你希望通过排序列表两次来实现。而当你做'返回(a.name - b.name)'你试图从另一个字符串中减去一个字符串。不会发生。 (你可能想改用[localeCompare](http://www.tutorialspoint.com/javascript/string_localecompare.htm)。) –

回答

33

我认为这是更好只是做...

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

正是我需要的!对不起,我不太清楚,但这是完美的!谢谢! –

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

4

如果你的意思,你希望他们通过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; 
}); 

否则你的问题还不清楚。

0

你的问题是你如何排序字母。
a.name - b.name

是不是在做你的想法。它不是以书法顺序对它们进行评估。 与

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

+0

如果名称相同,为什么您的代码返回“1”?它应该返回'0' – Bergi

+0

你是对的。这样做并不能保证相同的元素将保持原来的顺序。 – BostonJohn

1

取代它创建一个通用函数对它进行排序反正你想要的。检查下面

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); 
相关问题