Reputation: 11
I'm really new to this so sorry if my language would be not "technical
". I'll learn fast. I have json
object and im trying to find the correct way to gather the information in separate arrays the correct way
I'm using map
function to separate each key to a separate key because some keys belongs to another array and im getting a little bit confused. I would love for some explanations.
I added my expected solution in the bottom of my question, if thats help if im not clear.
Following is the json object:
var json_museums = {
"museums_costs": [
{
"museumType": "Art",
"costs": [
{
"date": "2018-10-01",
"employees": 1082220.3945979946,
"outsource": 9585.8794674401543
},
{
"date": "2018-11-01",
"employees": 1056643.6756958894,
"outsource": 11018.898987932616
},
{
"date": "2018-12-01",
"employees": 1022322.1218654147,
"outsource": 11954.748339502334
}
]
},
{
"museumType": "History",
"costs": [
{
"date": "2018-10-01",
"employees": 91336.329372028267,
"outsource": 0
},
{
"date": "2018-11-01",
"employees": 78130.417193652393,
"outsource": 0
},
{
"date": "2018-12-01",
"employees": 100755.62136033915,
"outsource": 0
}
]
},
{
"museumType": "Culture",
"costs": [
{
"date": "2018-10-01",
"employees": 66604.417069221658,
"outsource": 0
},
{
"date": "2018-11-01",
"employees": 63882.129662868538,
"outsource": 0
},
{
"date": "2018-12-01",
"employees": 108781.84734382466,
"outsource": 0
}
]
},
{
"museumType": "News",
"costs": [
{
"date": "2018-10-01",
"employees": 0,
"outsource": 1452.6775522557543
},
{
"date": "2018-11-01",
"employees": 0,
"outsource": 2366.423254655545
},
{
"date": "2018-12-01",
"employees": 0,
"outsource": 3485.5840149129986
}
]
},
{
"museumType": "Science",
"costs": [
{
"date": "2018-10-01",
"employees": 3237887.746893588,
"outsource": 0
},
{
"date": "2018-11-01",
"employees": 3218724.4935297123,
"outsource": 0
},
{
"date": "2018-12-01",
"employees": 2925562.2916941536,
"outsource": 0
}
]
},
{
"museumType": "Religious",
"costs": [
{
"date": "2018-10-01",
"employees": 291293.35185208195,
"outsource": 0
},
{
"date": "2018-11-01",
"employees": 171962.47103846565,
"outsource": 0
},
{
"date": "2018-12-01",
"employees": 95615.439855929668,
"outsource": 0
}
]
}
]
}
var results = [];
results = json_museums.museums_costs.map(function (x) {
return [x.museumType, x. visits.map(function(c) { c.date), x.costs.reduce(function (a, b, c) {
return a + b + c;
}, 0)]
});
(18) [Array(3), Array(3), Array(3), Array(3), Array(3), Array(3)]
0: (3) ["Art", "2018-10-01", outsource + employee]
1: (3) ["Art", "2018-11-01", outsource +employee]
2: (3) ["Art", "2018-12-01", outsource +employee]
3: (3) ["History", "2018-10-01", outsource + employee]
4: (3) ["History", "2018-11-01", outsource + employee]
5: (3) ["History", "2018-12-01", outsource + employee]
6: (3) ["Culture", "2018-10-01", outsource + employee]
7: (3) ["Culture", "2018-11-01", outsource + employee]
8: (3) ["Culture", "2018-12-01", outsource + employee]
9: (3) ["News", "2018-10-01", outsource + employee]
10: (3) ["News", "2018-11-01", outsource + employee]
11: (3) ["News", "2018-12-01", outsource + employee]
12: (3) ["Science", "2018-10-01", outsource + employee]
13: (3) ["Science", "2018-11-01", outsource + employee]
14: (3) ["Science", "2018-12-01", outsource + employee]
15: (3) ["Religious", "2018-10-01", outsource + employee]
16: (3) ["Religious", "2018-11-01", outsource + employee]
17: (3) ["Religious", "2018-12-01", outsource + employee]
Upvotes: 1
Views: 78
Reputation: 7675
It's possible to transform the object into the desired structure by:
museums_costs
cost
. At this point you have sufficient information to construct a unit of required resultconst json_museums = {"museums_costs":[{"museumType":"Art","costs":[{"date":"2018-10-01","employees":1082220.3945979946,"outsource":9585.879467440154},{"date":"2018-11-01","employees":1056643.6756958894,"outsource":11018.898987932616},{"date":"2018-12-01","employees":1022322.1218654147,"outsource":11954.748339502334}]},{"museumType":"History","costs":[{"date":"2018-10-01","employees":91336.32937202827,"outsource":0},{"date":"2018-11-01","employees":78130.41719365239,"outsource":0},{"date":"2018-12-01","employees":100755.62136033915,"outsource":0}]},{"museumType":"Culture","costs":[{"date":"2018-10-01","employees":66604.41706922166,"outsource":0},{"date":"2018-11-01","employees":63882.12966286854,"outsource":0},{"date":"2018-12-01","employees":108781.84734382466,"outsource":0}]},{"museumType":"News","costs":[{"date":"2018-10-01","employees":0,"outsource":1452.6775522557543},{"date":"2018-11-01","employees":0,"outsource":2366.423254655545},{"date":"2018-12-01","employees":0,"outsource":3485.5840149129986}]},{"museumType":"Science","costs":[{"date":"2018-10-01","employees":3237887.746893588,"outsource":0},{"date":"2018-11-01","employees":3218724.4935297123,"outsource":0},{"date":"2018-12-01","employees":2925562.2916941536,"outsource":0}]},{"museumType":"Religious","costs":[{"date":"2018-10-01","employees":291293.35185208195,"outsource":0},{"date":"2018-11-01","employees":171962.47103846565,"outsource":0},{"date":"2018-12-01","employees":95615.43985592967,"outsource":0}]}]};
const result = json_museums.museums_costs.map(museum =>
museum.costs.map(cost => [
museum.museumType,
cost.date,
cost.employees + cost.outsource
])
).flat(1);
console.log(result)
Upvotes: 0
Reputation: 17626
Using Array#reduce and Array#forEach
const data={museums_costs:[{museumType:"Art",costs:[{date:"2018-10-01",employees:1082220.3945979946,outsource:9585.879467440154},{date:"2018-11-01",employees:1056643.6756958894,outsource:11018.898987932616},{date:"2018-12-01",employees:1022322.1218654147,outsource:11954.748339502334}]},{museumType:"History",costs:[{date:"2018-10-01",employees:91336.32937202827,outsource:0},{date:"2018-11-01",employees:78130.41719365239,outsource:0},{date:"2018-12-01",employees:100755.62136033915,outsource:0}]},{museumType:"Culture",costs:[{date:"2018-10-01",employees:66604.41706922166,outsource:0},{date:"2018-11-01",employees:63882.12966286854,outsource:0},{date:"2018-12-01",employees:108781.84734382466,outsource:0}]},{museumType:"News",costs:[{date:"2018-10-01",employees:0,outsource:1452.6775522557543},{date:"2018-11-01",employees:0,outsource:2366.423254655545},{date:"2018-12-01",employees:0,outsource:3485.5840149129986}]},{museumType:"Science",costs:[{date:"2018-10-01",employees:3237887.746893588,outsource:0},{date:"2018-11-01",employees:3218724.4935297123,outsource:0},{date:"2018-12-01",employees:2925562.2916941536,outsource:0}]},{museumType:"Religious",costs:[{date:"2018-10-01",employees:291293.35185208195,outsource:0},{date:"2018-11-01",employees:171962.47103846565,outsource:0},{date:"2018-12-01",employees:95615.43985592967,outsource:0}]}]};
const res = data.museums_costs.reduce((a,{museumType,costs})=>{
costs.forEach(({employees, outsource, date})=>{
a.push([museumType, date, employees+outsource])
});
return a;
},[]);
console.log(res);
Upvotes: 0
Reputation: 12990
You can reduce
the top level array starting with an empty array as an accumulator and then map
over the costs and push the elements of the resulting array to the accumulator:
var json_museums = {"museums_costs":[{"museumType":"Art","costs":[{"date":"2018-10-01","employees":1082220.3945979946,"outsource":9585.8794674401543},{"date":"2018-11-01","employees":1056643.6756958894,"outsource":11018.898987932616},{"date":"2018-12-01","employees":1022322.1218654147,"outsource":11954.748339502334}]},{"museumType":"History","costs":[{"date":"2018-10-01","employees":91336.329372028267,"outsource":0},{"date":"2018-11-01","employees":78130.417193652393,"outsource":0},{"date":"2018-12-01","employees":100755.62136033915,"outsource":0}]},{"museumType":"Culture","costs":[{"date":"2018-10-01","employees":66604.417069221658,"outsource":0},{"date":"2018-11-01","employees":63882.129662868538,"outsource":0},{"date":"2018-12-01","employees":108781.84734382466,"outsource":0}]},{"museumType":"News","costs":[{"date":"2018-10-01","employees":0,"outsource":1452.6775522557543},{"date":"2018-11-01","employees":0,"outsource":2366.423254655545},{"date":"2018-12-01","employees":0,"outsource":3485.5840149129986}]},{"museumType":"Science","costs":[{"date":"2018-10-01","employees":3237887.746893588,"outsource":0},{"date":"2018-11-01","employees":3218724.4935297123,"outsource":0},{"date":"2018-12-01","employees":2925562.2916941536,"outsource":0}]},{"museumType":"Religious","costs":[{"date":"2018-10-01","employees":291293.35185208195,"outsource":0},{"date":"2018-11-01","employees":171962.47103846565,"outsource":0},{"date":"2018-12-01","employees":95615.439855929668,"outsource":0}]}]}
var results = json_museums.museums_costs.reduce((a, x) => {
a.push(...x.costs.map(cost => [x.museumType, cost.date, cost.outsource + cost.employees]));
return a;
}, []);
console.log(results);
Another way to do this would be with flatMap
, although that is not universally supported.
Upvotes: 1