如何通过两个关键字对JSON对象进行排序?

11

我有一个 JSON 对象,想要先按一个关键字排序,然后再按第二个关键字排序,类似于在 SQL 中按两列排序。这是我将要排序的 JSON 样例:

{
   "GROUPID":3169675,
   "LASTNAME":"Chantry"
}
我想按照GROUPID和LASTNAME对所有结果进行排序。我已经使用了JSON sort函数来按一个关键字排序,但不知道如何实现多重排序。希望得到帮助。

1
你的例子是针对对象属性哈希表的。根据定义,这些属性是无序的。我猜想你有一个包含这些对象的数组需要进行排序? - Jason McCreary
它是一个JSON对象数组吗? - Castrohenge
这个回答解决了你的问题吗?如何按多个字段对对象数组进行排序? - Vega
2个回答

42

这里是一种通用的方法,可以对具有多个列的对象数组进行排序:

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中的数组比较会将它们转换为由逗号分隔的字符串。


1
这个答案对你有帮助我很高兴,一个回答就足够了 ;) - Mic
正确。我是用if来计算距离的,所以数组比较是针对字符串的。哦,我有点困惑了。 - Jimmy Kane
该数组不仅适用于字符串,而且适用于不同类型的通用数组。您可以依赖它进行任何排序。我不确定为什么“||”序列会正确地对数字进行排序。 - Mic
这是错误的:在JS中,[2] < [10] 返回“false”,因为所有数组都被转换为字符串(使用“,”作为连接字符串),然后按字典顺序排序。 - Philip Z
@PhilipZ,非常有趣。很幸运的是cmp只返回1、-1或0,所以它适用于数组和值两种情况。我已经删除了错误示例。谢谢! - Mic
显示剩余2条评论

12
假设您有一个对象数组:
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部分。它提供了一些可定制的方法,可扩展到多个列。


为什么不比较一个键数组呢?这会使排序更通用,或者我错过了什么?请参见下面的回复。 - Mic
@Mic - 这正是我在链接的答案中所做的。我不想再重写一遍整个东西,所以只是添加了一个链接。 - Anurag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接