Вам нужно будет определить JSON['group']
, чтобы получить правильную настройку значения JSON['flights']
.
Сопоставьте это с поиском текущих сокращенных результатов, и вы сможете обновлять значения или добавлять новые элементы по мере их поступления.
var rawData = [
{ "Month/Year": "2019-09", "group": "blue", "flights": "668620" },
{ "Month/Year": "2019-10", "group": "blue", "flights": "662520" },
{ "Month/Year": "2019-09", "group": "green", "flights": "662520" },
{ "Month/Year": "2019-10", "group": "green", "flights": "678520" }
];
console.log(processData(rawData));
function processData(data) {
return data.reduce((result, item, index) => {
let found = result.find(d => d.name === item['Month/Year']);
if (found) {
Object.assign(found, {
gr : item['group'] === 'green' ? item['flights'] : found.gr,
hv : item['group'] === 'blue' ? item['flights'] : found.hv
});
} else {
result.push({
name : item['Month/Year'],
gr : item['group'] === 'green' ? item['flights'] : null,
hv : item['group'] === 'blue' ? item['flights'] : null,
});
}
return result;
}, []);
}
.as-console-wrapper { top: 0; max-height: 100% !important; }
Динамический пример
var rawData = [
{ "Month/Year": "2019-09", "group": "blue", "flights": "668620" },
{ "Month/Year": "2019-10", "group": "blue", "flights": "662520" },
{ "Month/Year": "2019-09", "group": "green", "flights": "662520" },
{ "Month/Year": "2019-10", "group": "green", "flights": "678520" }
];
console.log(processData(rawData, 'Month/Year', {
gr : (item) => item['group'] === 'green' ? item['flights'] : null,
hv : (item) => item['group'] === 'blue' ? item['flights'] : null
}));
function processData(data, key, mappers) {
return data.reduce((result, item, index) => {
let found = result.find(d => d.name === item[key]);
if (found) {
Object.keys(mappers).forEach(key => found[key] = mappers[key](item) || found[key]);
} else {
result.push(Object.keys(mappers).reduce((obj, key) => {
return Object.assign(obj, { [key] : mappers[key](item) })
}, { name : item[key] }));
}
return result;
}, []);
}
.as-console-wrapper { top: 0; max-height: 100% !important; }