我一直在苦苦挣扎几个小时,但是无法做到。我需要一个将对象分组并对对象中的某些项进行计数或求和的函数。我的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}];
*/
}
答案 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));