可能重复:
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。
编辑:很抱歉这个混乱,我已经对这个问题感到困惑了一段时间。
我想要完成的是先按最高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"
}
]
答案 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;