const array = [
{
"properties": {
"name": "Название 1",
"id": 1,
"groups": [
{
"id": 0,
"name": "Группа 1",
'well-being': 0.9,
'needs': [
{
"id": 1,
"name": "Потребность/ценность 1",
"value": 0.5
},
{
"id": 2,
"name": "Потребность/ценность 2",
"value": 0.6
},
{
"id": 3,
"name": "Потребность/ценность 3",
"value": 0.9
}
],
'provision': [
{
"id": 1,
"name": "Потребность/ценность 1",
"value": 0.8
},
{
"id": 2,
"name": "Потребность/ценность 2",
"value": 0.4
},
{
"id": 3,
"name": "Потребность/ценность 3",
"value": 0.2
}
]
},
{
"id": 1,
"name": "Группа 2",
'well-being': 0.5,
'needs': [
{
"id": 1,
"name": "Потребность/ценность 1",
"value": 0.4
},
{
"id": 2,
"name": "Потребность/ценность 2",
"value": 0.3
},
{
"id": 3,
"name": "Потребность/ценность 3",
"value": 0.7
}
],
'provision': [
{
"id": 1,
"name": "Потребность/ценность 1",
"value": 0.2
},
{
"id": 2,
"name": "Потребность/ценность 2",
"value": 0.5
},
{
"id": 3,
"name": "Потребность/ценность 3",
"value": 0.7
}
]
},
{
"id": 2,
"name": "Группа 3",
'well-being': 0.4,
'needs': [
{
"id": 1,
"name": "Потребность/ценность 1",
"value": 0.5
},
{
"id": 2,
"name": "Потребность/ценность 2",
"value": 0.2
},
{
"id": 3,
"name": "Потребность/ценность 3",
"value": 0.4
}
],
'provision': [
{
"id": 1,
"name": "Потребность/ценность 1",
"value": 0.9
},
{
"id": 2,
"name": "Потребность/ценность 2",
"value": 0.5
},
{
"id": 3,
"name": "Потребность/ценность 3",
"value": 0.2
}
]
}
]
}
},
{
"properties": {
"name": "Название 2",
"id": 2,
"groups": [
{
"id": 0,
"name": "Группа 1",
'well-being': 0.8,
'needs': [
{
"id": 1,
"name": "Потребность/ценность 1",
"value": 0.5
},
{
"id": 2,
"name": "Потребность/ценность 2",
"value": 0.3
},
{
"id": 3,
"name": "Потребность/ценность 3",
"value": 0.5
}
],
'provision': [
{
"id": 1,
"name": "Потребность/ценность 1",
"value": 0.9
},
{
"id": 2,
"name": "Потребность/ценность 2",
"value": 0.2
},
{
"id": 3,
"name": "Потребность/ценность 3",
"value": 0.5
}
]
},
{
"id": 1,
"name": "Группа 2",
'well-being': 0.3,
'needs': [
{
"id": 1,
"name": "Потребность/ценность 1",
"value": 0.3
},
{
"id": 2,
"name": "Потребность/ценность 2",
"value": 0.5
},
{
"id": 3,
"name": "Потребность/ценность 3",
"value": 0.6
}
],
'provision': [
{
"id": 1,
"name": "Потребность/ценность 1",
"value": 0.9
},
{
"id": 2,
"name": "Потребность/ценность 2",
"value": 0.2
},
{
"id": 3,
"name": "Потребность/ценность 3",
"value": 0.2
}
]
},
{
"id": 2,
"name": "Группа 3",
'well-being': 0.8,
'needs': [
{
"id": 1,
"name": "Потребность/ценность 1",
"value": 0.4
},
{
"id": 2,
"name": "Потребность/ценность 2",
"value": 0.6
},
{
"id": 3,
"name": "Потребность/ценность 3",
"value": 0.1
}
],
'provision': [
{
"id": 1,
"name": "Потребность/ценность 1",
"value": 0.6
},
{
"id": 2,
"name": "Потребность/ценность 2",
"value": 0.9
},
{
"id": 3,
"name": "Потребность/ценность 3",
"value": 0.3
}
]
}
]
}
},
{......},
{......}
];
[
{
id:0,
name:'Группа 1',
value: /*среднее значение well-being*/,
values: [
{
id:1,
name: 'Потребность/ценность 1',
needs: /*среднее значение needs*/,
provision: /*среднее значение provision*/
},
{......},
{......}
]
},
{......},
{......}
]
const average = arr => arr.reduce((acc, n) => acc + n, 0) / arr.length;
const extractValues = (group, item, key) => item[key].forEach(n => ((group.values[n.id] ||= { id: n.id, name: n.name })[key] ||= []).push(n.value));
const result = Object
.values(arr
.flatMap(n => n.properties.groups)
.reduce((acc, n) => (
acc[n.id] ||= {
id: n.id,
name: n.name,
wellBeing: [],
values: {},
},
acc[n.id].wellBeing.push(n['well-being']),
extractValues(acc[n.id], n, 'needs'),
extractValues(acc[n.id], n, 'provision'),
acc
), {}))
.map(n => ({
id: n.id,
name: n.name,
value: average(n.wellBeing),
values: Object.values(n.values).map(m => (
m.needs = average(m.needs),
m.provision = average(m.provision),
m
))
}));