在二级数组上的JSON分组

时间:2012-08-23 02:17:52

标签: javascript json

我正在寻找group by来执行第二级JSON字符串。例如,我使用下面的代码来使用group by它可以很好地工作,其中JSON字符串中有1级数组。

Array.prototype.groupBy = function(keyName) {
  var res = {};
  this.forEach(function(x) {
    var k = x[keyName];
    var v = res[k];
    if (!v) v = res[k] = [];
    v.push(x);
  });
  return res;
};

var myObject = {
      "groups": [{
            "id": "2",
            "name": "test group 1",
            "category": "clinical note",
            "author": "RRP"
        }, {
            "id": "1",
            "name": "test group 2",
            "category": "clinical image",
            "author": "LKP"
        }, {
            "id": "2",
            "name": "test group 1",
            "category": "clinical document",
            "author": "RRP"
        }, {
            "id": "4",
            "name": "test group 4",
            "category": "clinical note",
            "author": "John"
        }]

}

myObject.groups.sort(function(a,b) { return a.author > b.author } );    

var byJob = myObject.groups.groupBy('id');

for (var author in byJob) {
  document.write('<h3>'+author+','+byJob[author].length+'</h3>');  
  byJob[author].forEach(function(e) {  
    document.write('<p>'+e.id +', '+e.name+'</p>');
  });

输出:

1,1

1, test group 2

2,2

2, test group 1

2, test group 1

4,1

4, test group 4

现在上面的示例工作得非常好,但我正在寻找JSON字符串中的二级数组分组。举例来说,如果我有以下JSON字符串::

{
    "Category": {
        "old_modi":1,
        "new_modi":1,
        "FORM": [{
            "name":"form1",
            "date":"08/08/2012",
            "location":"abc",
            "PERSON":[{
                "ID":1,
                "author":"xyz"
            }]
        }]
    }
}

期望输出(作者姓名将按表格名称,日期和地点分组)::

xyz
  form1 08/08/2012 xyz

任何人都知道我在顶部发布的工作副本中哪一部分需要更改?

提前致谢..

1 个答案:

答案 0 :(得分:0)

您可以递归地遍历javascript对象。一个棘手的问题是javascript对象可以是json对象或数组。在我的示例解决方案中,我为每个解决方案定义了两个不同的for循环,可能有一种简单的方法可以做到这一点。无论如何,我的解决方案适用于任何级别的groupby。这是jsFiddle