【问题标题】:How to order a JSON object by two keys?如何通过两个键对 JSON 对象进行排序?
【发布时间】:2011-03-14 21:19:11
【问题描述】:

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

{
   "GROUPID":3169675,
   "LASTNAME":"Chantry"
}

我想按 GROUPID 然后按 LASTNAME 对所有结果进行排序。我使用 JSON 排序功能按一个键而不是多个键进行排序。

任何帮助都会很棒。

【问题讨论】:

标签: javascript json


【解决方案1】:

以下是对具有多列的对象数组进行排序的通用方法:

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

【讨论】:

  • 这个答案一个就够了;)很高兴看到它对你有帮助!
  • 问题 为什么是数组?为什么不只是(a.name - b.name) || (a.id - b.id) 你可以继续喜欢:(a.name - b.name) || (a.id - b.id) || (a.idd - b.idd)
  • @JimmyKane a.name - b.name 是字符串的差异,将返回 NaN。为什么你认为它会起作用?
  • 正确。我用 if 表示距离。所以数组比较是针对字符串的。 Ouf 和我有点困惑。
  • 该数组不仅适用于字符串,而且适用于不同类型。你可以依靠它来做任何事情。我不确定为什么会出现一系列... || ... 将正确排序数字。
【解决方案2】:

假设你有一个对象数组:

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

这是我最近回答的另一个非常similar question。它是关于使用 jQuery 对多列进行排序的,但是您可以轻松地去掉 jQuery 部分。它提供了一些可定制的方法,这些方法可以扩展到多个列。

【讨论】:

  • 你为什么不比较一个键数组呢?它使排序更通用还是我错过了什么?请参阅下面的回复。
  • @Mic - 这正是我在链接答案中所做的。我不想再重写整个东西,所以只是添加了一个链接。
猜你喜欢
  • 2021-12-24
  • 2019-05-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2020-12-04
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多