按属性在Javascript中重新组织我的JSON对象

时间:2015-07-19 15:22:56

标签: javascript arrays json angularjs

我遇到了一个问题。我从我的网络后端直接从我的数据库收到这种json文件。但是在结构的情况下,我希望它在客户端构造它以保持数据库访问和http请求低。此数组中的每个元素代表一个数据集,其中包含一个名为“sub”的子类别和一个名为“main”的主类别。因为我正在使用AngularJS,我想用ng-repeat在不同的元素中显示它们。因此,我想重新组织这个json的结构,所以我得到了一个主类别数组,它有一个包含数据的子类别数组(也是一个数组)。

 [
   {name: 'A', ..., sub: 'sub1', main: 'main1'},
   {name: 'B', ..., sub: 'sub1', main: 'main1'},
   {name: 'C', ..., sub: 'sub2', main: 'main1'},
   {name: 'D', ..., sub: 'sub3', main: 'main2'},
   ....
]

应重组为以下内容:

[
   main1 : [
               sub1 : [    
                  {name: 'A', ...},
                  {name: 'B', ...}
               ],
               sub2 : [
                  {name: 'C', ...}
               ]
           ],
   main2 : [
               sub3 : [
                  {name: 'D', ...}

               ]
           ]
]

我编写了一些解决方案,其中许多循环遍历数组,记忆所有子类别和主类别等等,但主要问题是创建这些数组,名为main1和main2(然后是sub1和sub2,sub3 )。问题是我无法找到命名这些数组的解决方案,因为它们基于我的“输入数据”中的字符串值。

...
var subValue = .... (get name of sub category)
var result.push({subValue: []});
...

这不起作用。所有数组元素都称为subValue,而不是我想要设置的名称。

我希望我能得到某种相关的信息。

2 个答案:

答案 0 :(得分:0)

您请求的输出是不可能的,因为数组成员不是对象属性。没有"关键:价值"在数组中。 main1是一个数组,它可以包含值,但不包含键(因此您无法生成main1: [ sub1:...

使用对象而不是数组,或者使用没有键的值数组

P.S。,你应该看看lodash或类似的图书馆,它将为你做大部分繁重的工作

答案 1 :(得分:0)

假设这是您要寻找的输出:

{
    main1 : {
        sub1 : [    
              {name: 'A', ...},
              {name: 'B', ...}
           ],
        sub2 : [ {name: 'C', ...} ]
    }, 
    main2 : {
        sub3 : [ {name: 'D', ...} ]
    }
}

您可以使用下划线和两个分组来解决此问题

var arr = [
    {name: 'A', sub: 'sub1', main: 'main1'},
    {name: 'B', sub: 'sub1', main: 'main1'},
    {name: 'C', sub: 'sub2', main: 'main1'},
    {name: 'D', sub: 'sub3', main: 'main2'}
];

var grouped = _.chain(arr)
           .groupBy('main')
           .mapObject(function(item) { return _.groupBy(item, 'sub');})
           .value();