我有一个 JSON 对象,想要先按一个关键字排序,然后再按第二个关键字排序,类似于在 SQL 中按两列排序。这是我将要排序的 JSON 样例:
{
"GROUPID":3169675,
"LASTNAME":"Chantry"
}
我想按照GROUPID和LASTNAME对所有结果进行排序。我已经使用了JSON sort函数来按一个关键字排序,但不知道如何实现多重排序。希望得到帮助。我有一个 JSON 对象,想要先按一个关键字排序,然后再按第二个关键字排序,类似于在 SQL 中按两列排序。这是我将要排序的 JSON 样例:
{
"GROUPID":3169675,
"LASTNAME":"Chantry"
}
我想按照GROUPID和LASTNAME对所有结果进行排序。我已经使用了JSON sort函数来按一个关键字排序,但不知道如何实现多重排序。希望得到帮助。这里是一种通用的方法,可以对具有多个列的对象数组进行排序:
var arr = [
{ id:5, name:"Name3" },
{ id:4, name:"Name1" },
{ id:6, name:"Name2" },
{ id:3, name:"Name2" }
],
// generic comparison function
cmp = function(x, y){
return x > y ? 1 : x < y ? -1 : 0;
};
//sort name ascending then id descending
arr.sort(function(a, b){
//note the minus before -cmp, for descending order
return cmp(
[cmp(a.name, b.name), -cmp(a.id, b.id)],
[cmp(b.name, a.name), -cmp(b.id, a.id)]
);
});
要添加其他列进行排序,您可以在数组比较中添加其他项。
arr.sort(function(a, b){
return cmp(
[cmp(a.name, b.name), -cmp(a.id, b.id), cmp(a.other, b.other), ...],
[cmp(b.name, a.name), -cmp(b.id, a.id), cmp(b.other, a.other), ...]
);
});
编辑:根据下面@PhilipZ的评论,JS中的数组比较会将它们转换为由逗号分隔的字符串。
var data = [
{ "GROUPID":3169675, "LASTNAME":"Chantry" },
{ "GROUPID":3169612, "LASTNAME":"Doe" },
...
];
GROUPID
排序,然后再按LASTNAME
排序,则比较两个对象的逻辑应为:if GROUPID of first is smaller than second
return -1;
else if GROUPID of first is larger than second
return 1;
else if LASTNAME of first is smaller than second
return -1;
else if LASTNAME of first is larger than second
return 1;
else
return 0;
要对对象数组进行排序,请使用上述算法并在数组上调用sort方法。排序完成后,data
应按所需的排序顺序包含元素。
data.sort(function(a, b) {
// compare a and b here using the above algorithm
});
这是我最近回答的另一个非常 相似的问题。它涉及使用jQuery在多个列上进行排序,但您可以轻松地去除jQuery部分。它提供了一些可定制的方法,可扩展到多个列。