重新排序JSON集合

时间:2013-02-06 13:18:41

标签: javascript json web-applications underscore.js

我从我的服务器获取JSON数组,如下所示:

     [ {name: "Web Design", id: "27", month_n: "1", data: "68.00"},
     {name: "Web Design", id: "27", month_n: "2", data: "56.00"} ,
     {name: "Homework", id: "4", month_n: "2", data: "15.00"} ,
     {name: "Gaming", id: "12", month_n: "2", data: "5.00"} ]

在客户端,我想重新排序,以便有类似的内容:

 [{name: "Web Design", data:[68.00,56.00]}, {name:"Homework", data:[0,15]} and so on...

“数据”值按“id”编号和月份编号分组(默认为0,如果没有匹配的月份)。

最好的方法是什么?我尝试了纯粹的JavaScript方式,但是我很难过!我也听说过使用下划线JS更容易。但不知道从哪里开始。

有人请赐教我吗?

2 个答案:

答案 0 :(得分:1)

在vanilla JavaScript中执行此操作的一种方法是使用辅助对象,如以下代码所示。

在第一步中,我们会识别所有不同的name值,并按照它们对所有data字段进行分组。 在第二步中,将辅助对象转换回数组。

var arr =  [ {name: "Web Design", id: "27", month_n: "1", data: "68.00"},
     {name: "Web Design", id: "27", month_n: "2", data: "56.00"} ,
     {name: "Homework", id: "4", month_n: "2", data: "15.00"} ,
     {name: "Gaming", id: "12", month_n: "2", data: "5.00"} ];

// use a helper object to identify all distinct "names"
var helper = {};
for( var i=arr.length; i--; ) {
  // init an array, if it is not there
  helper[ arr[i]['name'] ] = helper[ arr[i]['name'] ] || [];

  // add the newest element
  helper[ arr[i]['name'] ].push( helper[ arr[i]['data'] ] );
}

// convert back to an array
var newArr = [];
for( var key in helper ) {
 if( helper.hasOwnProperty( key ) ) {
   newArr.push( { 'name': key, 'data': helper[key] } );
 }
}

答案 1 :(得分:1)

这可以通过两个操作完成:

  1. Groupby [ name ]字段,然后
  2. 采摘[数据]字段
  3. 有一些纯JS数组原型扩展库可以实现这一目标以及许多其他操作。你可以看一下underscore.js。我还写了一个简单的JS库jsList。它附带了许多单元测试作为示例。

    您只需要写下这些行:

    var arr = [ {name: "Web Design", id: "27", month_n: "1", data: "68.00"},
                {name: "Web Design", id: "27", month_n: "2", data: "56.00"} ,
                {name: "Homework", id: "4", month_n: "2", data: "15.00"} ,
                {name: "Gaming", id: "12", month_n: "2", data: "5.00"} ];
    
    var temp = arr.groupBy(function(item){ return item.name });
    
    var result = [];
    for(var key in temp){
        result.push({name: key, data: temp[key].pluck('data')});
    }
    

    您可以使用Object.keys来避免for循环,但它只附带Javascript 1.8.5或更高版本。

    感谢。