使用javascript/jquery对JSON数据进行分组/排序

使用javascript/jquery对JSON数据进行分组/排序,javascript,jquery,json,Javascript,Jquery,Json,我有一个JSON数据,我需要做一些类似GROUPBY的事情,我在这里问过这个问题,但我没有得到任何满意的答案,所以这次我想更深入地解释 首先,有谁能解释一下javascript中的groupby和orderby之间的区别,就像在sql中一样,为了使用groupby,我们需要使用聚合函数。但我不想要聚合函数之类的东西。在这里,我提供了一个我一直在寻找的JSON数据和输出示例 所有作者姓名应按字母数字顺序排列 JSON数据: var myObject = { "Apps": [

我有一个JSON数据,我需要做一些类似GROUPBY的事情,我在这里问过这个问题,但我没有得到任何满意的答案,所以这次我想更深入地解释

首先,有谁能解释一下javascript中的
groupby
orderby
之间的区别,就像在sql中一样,为了使用
groupby
,我们需要使用聚合函数。但我不想要聚合函数之类的东西。在这里,我提供了一个我一直在寻找的JSON数据和输出示例

所有作者姓名应按字母数字顺序排列

JSON数据:

var myObject = {
    "Apps": [
        {
            "Name": "app1",
            "id": "1",
            "groups": [
                {
                    "id": "1",
                    "name": "test group 1",
                    "category": "clinical note",
                    "author": "RRP"
                }, {
                    "id": "2",
                    "name": "test group 2",
                    "category": "clinical image",
                    "author": "LKP"
                }, {
                    "id": "3",
                    "name": "test group 3",
                    "category": "clinical document",
                    "author": "RRP"
                }, {
                    "id": "4",
                    "name": "test group 4",
                    "category": "clinical note",
                    "author": "John"
                }
            ]
        }
    ]
}
预期产出:

John
  4 testgroup4 clinicalnote 
RRP
  1 testgroup1  clinicalnote
  3 testgroup3  clinicaldocument
LKP
  2 testgroup2 clinicalimage    
任何想法/建议/方向/想法都会大有帮助

对于此场景,Javascript中没有内置的“groupby”或“orderby”。您必须手动执行此操作。类似这样的事情可能会有所帮助:

var groups = myObject.Apps[0].groups;
var authors = {};
var authorNames = [];

for(var i = 0; i < groups.length; i++) {
    var group = groups[i];    

    if(typeof authors[group.author] === "undefined") {
        authors[group.author] = [];
        authorNames.push(group.author);
        authorNames.sort();
    }

    authors[group.author].push({
        id: group.id,
        name: group.name,
        category: group.category
    });       
}
var groups=myObject.Apps[0]。组;
var={};
var authorNames=[];
对于(变量i=0;i
通常在关联数组中,您并不真正关心键的顺序,而迭代键的顺序通常是不保证的。我在这里做的是按照排序顺序维护一个单独的名称数组。然后,我可以迭代该数组,并使用这些值从关联数组中获取关联对象


查看。

您可以通过以下方式轻松完成:

输出一个JSON对象:

{
 "John":[{"id":"4","name":"test group 4","category":"clinical note","author":"John"}],
 "LKP":[{"id":"2","name":"test group 2","category":"clinical image","author":"LKP"}],
 "RRP":[{"id":"1","name":"test group 1","category":"clinical note","author":"RRP"},{"id":"3","name":"test group 3","category":"clinical document","author":"RRP"}]
}
用于通过键减速器和分类器创建通用组。我要把减速机从机器上取下来。这样,您就可以按照自己喜欢的任何键进行排序和分组,就像在SQL中那样

constgroupby=key=>(结果,当前)=>{
const item=Object.assign({},当前);
如果(结果类型[当前[键]]==“未定义”){
结果[当前[键]]=[项];
}否则{
结果[当前[键]]推送(项);
}
返回结果;
};
const stringSortBy=key=>(a,b)=>{
常数sa=一个[键];
常数sb=b[键];
返回sasb);
};
常量myObject={
“应用程序”:[
{
“名称”:“app1”,
“id”:“1”,
“团体”:[
{
“id”:“1”,
“名称”:“测试组1”,
“类别”:“临床记录”,
“作者”:“RRP”
}, {
“id”:“2”,
“名称”:“测试组2”,
“类别”:“临床图像”,
“作者”:“LKP”
}, {
“id”:“3”,
“名称”:“测试组3”,
“类别”:“临床文件”,
“作者”:“RRP”
}, {
“id”:“4”,
“名称”:“测试组4”,
“类别”:“临床记录”,
“作者”:“约翰”
}
]
}
]
}
const categories=myObject.Apps[0].groups.reduce(groupBy('category'),{});
控制台日志(类别);
const sorted=myObject.Apps[0]。groups.sort(stringSortBy('author'));

控制台日志(已排序)JavaScript中没有groupby/orderby,或者您是否使用库?如果您正在谈论SQL,请提供您的查询。感谢您的回复。没有SQL。我只有JSON数据。我知道javascript中没有groupby/orderby。我有没有办法达到这个目标。不,我不能使用库,因为我们开发了我们的内部语言。我知道库并不重要,但由于公司的政策,我不能使用第三方javascript库。谢谢Vivin。我将首先进行排序,然后将整个对象传递给gropu,这样我将得到准确的顺序。我想你的解决方案会解决的。如果我希望新对象是格式如下:{username:“Jhon”,userinfo:[{…}]}?@Q_ro然后您可以使用或
map
对结果对象进行后期处理,但这已经是另一个问题了
{
 "John":[{"id":"4","name":"test group 4","category":"clinical note","author":"John"}],
 "LKP":[{"id":"2","name":"test group 2","category":"clinical image","author":"LKP"}],
 "RRP":[{"id":"1","name":"test group 1","category":"clinical note","author":"RRP"},{"id":"3","name":"test group 3","category":"clinical document","author":"RRP"}]
}