Arish Beta
Arish Beta

Reputation: 11

How to correctly collect json data in specific order

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

Answers (3)

antonku
antonku

Reputation: 7675

It's possible to transform the object into the desired structure by:

  • mapping over museums_costs
  • inside the above map, map over cost. At this point you have sufficient information to construct a unit of required result
  • after the above execution a nested array is created. You can flatten it by using Array.prototype.flat

const 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

kockburn
kockburn

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

slider
slider

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

Related Questions