从数组中的对象分组数据

时间:2015-09-15 10:39:36

标签: javascript arrays object grouping

我一直在苦苦挣扎几个小时,但是无法做到。我需要一个将对象分组并对对象中的某些项进行计数或求和的函数。我的var vData是必须转换为var result的起点,如下例所示。

var vData = [{group: 1, subgroup: 1, position: 1, level: 1, action: 1, desciption: 'description #1'},
             {group: 1, subgroup: 1, position: 1, level: 2, action: 1, desciption: 'description #2'},
             {group: 1, subgroup: 1, position: 2, level: 3, action: 1, desciption: 'description #3'},
             {group: 1, subgroup: 1, position: 4, level: 3, action: 1, desciption: 'description #4'},
             {group: 1, subgroup: 2, position: 2, level: 3, action: 1, desciption: 'description #5'},
             {group: 1, subgroup: 2, position: 2, level: 1, action: 2, desciption: 'description #6'},
             {group: 2, subgroup: 1, position: 1, level: 1, action: 1, desciption: 'description #7'},
             {group: 2, subgroup: 2, position: 1, level: 3, action: 1, desciption: 'description #8'},
             {group: 2, subgroup: 3, position: 1, level: 1, action: 1, desciption: 'description #9'}];

function fGroupData(vData){

/*
var result = [{group: 1, subgroup: 1, count_of_objects: 4, count_of_unique_positions: 3, sum_of_level: 9},
              {group: 1, subgroup: 2, count_of_objects: 2, count_of_unique_positions: 1, sum_of_level: 4},
              {group: 2, subgroup: 1, count_of_objects: 1, count_of_unique_positions: 1, sum_of_level: 1},
              {group: 2, subgroup: 2, count_of_objects: 1, count_of_unique_positions: 1, sum_of_level: 3},
              {group: 2, subgroup: 3, count_of_objects: 1, count_of_unique_positions: 1, sum_of_level: 1}];
  */            

}

2 个答案:

答案 0 :(得分:1)

我建议将任务分为两部分,首先收集级别,然后评估级别。

function fGroupData(vData) {
    var result = vData.reduce(function (r, a) {
            var index;
            r.some(function (b, i) {
                if (a.group === b.group && a.subgroup === b.subgroup) {
                    index = i;
                    return true;
                }
            }) ? r[index].levels.push(a.level) : r.push({ group: a.group, subgroup: a.subgroup, levels: [a.level] });
            return r;
        }, []);
    result.forEach(function (a) {
        a.count_of_objects = a.levels.length;
        a.count_of_unique_positions = 0;
        a.levels.sort().reduce(function (last, el) {
            last !== el && a.count_of_unique_positions++;
            return el;
        }, undefined);
        a.sum_of_level = a.levels.reduce(function (a, b) { return a + b; });
        delete a.levels;
    });
    return result;
}

var vData = [
    { group: 1, subgroup: 1, position: 1, level: 1, action: 1, desciption: 'description #1' },
    { group: 1, subgroup: 1, position: 1, level: 2, action: 1, desciption: 'description #2' },
    { group: 1, subgroup: 1, position: 2, level: 3, action: 1, desciption: 'description #3' },
    { group: 1, subgroup: 1, position: 4, level: 3, action: 1, desciption: 'description #4' },
    { group: 1, subgroup: 2, position: 2, level: 3, action: 1, desciption: 'description #5' },
    { group: 1, subgroup: 2, position: 2, level: 1, action: 2, desciption: 'description #6' },
    { group: 2, subgroup: 1, position: 1, level: 1, action: 1, desciption: 'description #7' },
    { group: 2, subgroup: 2, position: 1, level: 3, action: 1, desciption: 'description #8' },
    { group: 2, subgroup: 3, position: 1, level: 1, action: 1, desciption: 'description #9' }
];

document.write('<pre>' + JSON.stringify(fGroupData(vData), 0, 4) + '</pre>');

答案 1 :(得分:0)

必须有其他优雅的方式。但是以下函数将执行您想要的输出:

function getFormattedJSON(vData)
{
   var tempArr     = [];
   var result      = [];
   var finalResult = [];
   for(i in vData){
      var row  = vData[i];
      var uKey = row.group + ':' + row.subgroup;
      if(tempArr.indexOf(uKey) > -1)
      {
         objectCnt.push(uKey);
         if(uniquePositions.indexOf(row.position) < 0) {
            uniquePositions.push(row.position);
        }

         groupLevel.push(row.level);

         result[uKey][0] = {group: row.group, subgroup: row.subgroup, count_of_objects: objectCnt.length, count_of_unique_positions: uniquePositions.length, sum_of_level: groupLevel.reduce((a, b) => a + b)};
      }
      else{
         tempArr.push(uKey);
         result[uKey] = [];
         var objectCnt        = [];
         var uniquePositions  = [];
         var groupLevel       = [];
         objectCnt.push(uKey);
         uniquePositions.push(row.position);
         groupLevel.push(row.level);
         result[uKey].push({group: row.group, subgroup: row.subgroup, count_of_objects: 1, count_of_unique_positions: 1, sum_of_level: row.level});
      }
   }

   for(j in result){
    finalResult.push(result[j][0]);
   }
   return finalResult;
}
console.log(getFormattedJSON(vData));