rob.m
rob.m

Reputation: 10571

How to group object and its values?

I am expecting something like:

0:
  Province_State: "Alabama", 
  lat: 45.0732745,
  long: 7.680687483,
  0 data:
   0 date: "2/24/20",
       positive: 329,
       negative: 10790,
       pending: null,
       hospitalizedCurrently: 42,
       hospitalizedCumulative: 36...
   1 date: "2/25/20",
       positive: 329,
       negative: 10790,
       pending: null,
       hospitalizedCurrently: 42,
       hospitalizedCumulative: 36..

Using this:

const formatted = data.map(area => {
return {
    "state": area["Province_State"],
    "lat": area["lat"],
    "long": area["long"],
    "data": Object.assign({},Object.keys(area)
    .map(date => ({ date: area[date], Deaths: area[date], Confirmed: area[date], Recovered: area[date], Active: area[date], 
        FIPS: area[date], Incident_Rate: area[date], People_Tested: area[date], People_Hospitalized: area[date],
        Mortality_Rate: area[date], UID: area[date], ISO3: area[date], Testing_Rate: area[date],
        Hospitalization_Rate: area[date]  })))
    }
});

But having wrong grouping

data:
0: {date: "Alabama", Deaths: "Alabama", Confirmed: "Alabama", Recovered: "Alabama", Active: "Alabama", …}
1: {date: "US", Deaths: "US", Confirmed: "US", Recovered: "US", Active: "US", …}
2: {date: "2020-05-10 02:32:34", Deaths: "2020-05-10 02:32:34", Confirmed: "2020-05-10 02:32:34", Recovered: "2020-05-10 02:32:34", Active: "2020-05-10 02:32:34", …}
3: {date: "32.3182", Deaths: "32.3182", Confirmed: "32.3182", Recovered: "32.3182", Active: "32.3182", …}
4: {date: "-86.9023", Deaths: "-86.9023", Confirmed: "-86.9023", Recovered: "-86.9023", Active: "-86.9023", …}
5: {date: "9668", Deaths: "9668", Confirmed: "9668", Recovered: "9668", Active: "9668", …}
6: {date: "390", Deaths: "390", Confirmed: "390", Recovered: "390", Active: "390", …}
7: {date: "", Deaths: "", Confirmed: "", Recovered: "", Active: "", …}
8: {date: "9278.0", Deaths: "9278.0", Confirmed: "9278.0", Recovered: "9278.0", Active: "9278.0", …}
9: {date: "1", Deaths: "1", Confirmed: "1", Recovered: "1", Active: "1", …}
10: {date: "206.1892167816866", Deaths: "206.1892167816866", Confirmed: "206.1892167816866", Recovered: "206.1892167816866", Active: "206.1892167816866", …}
11: {date: "125494", Deaths: "125494", Confirmed: "125494", Recovered: "125494", Active: "125494", …}
12: {date: "1228", Deaths: "1228", Confirmed: "1228", Recovered: "1228", Active: "1228", …}
13: {date: "4.033926354985519", Deaths: "4.033926354985519", Confirmed: "4.033926354985519", Recovered: "4.033926354985519", Active: "4.033926354985519", …}
14: {date: "84000001", Deaths: "84000001", Confirmed: "84000001", Recovered: "84000001", Active: "84000001", …}
15: {date: "USA", Deaths: "USA", Confirmed: "USA", Recovered: "USA", Active: "USA", …}
16: {date: "2676.4076924701053", Deaths: "2676.4076924701053", Confirmed: "2676.4076924701053", Recovered: "2676.4076924701053", Active: "2676.4076924701053", …}
17: {date: "12.701696317749276", Deaths: "12.701696317749276", Confirmed: "12.701696317749276", Recovered: "12.701696317749276", Active: "12.701696317749276", …}

Where am I doing it wrong?

UPDATE

Also tried:

        const formatted = Object.assign(
            {},data.map(
                area => {
                    return {
                        "state": area["state"],
                        "lat": area["lat"],
                        "long": area["long"],
                        "data": Object.assign({},Object.keys(area)
                            .map(
                                date => ({ 
                                    date: area[date], Deaths: area[date], Confirmed: area[date], Recovered: area[date], Active: area[date], 
                                    FIPS: area[date], Incident_Rate: area[date], People_Tested: area[date], People_Hospitalized: area[date],
                                    Mortality_Rate: area[date], UID: area[date], ISO3: area[date], Testing_Rate: area[date],
                                    Hospitalization_Rate: area[date]                       
                                })
                            )
                        )
                    };
                }
            )
        );

UPDATE TWO

Sample data:

var data =[
    {
        "Province_State": "Alabama",
        "Country_Region": "US",
        "date": "2020-05-10 02:32:34",
        "lat": "32.3182",
        "long": "-86.9023",
        "Confirmed": "9668",
        "Deaths": "390",
        "Recovered": "",
        "Active": "9278.0",
        "FIPS": "1",
        "Incident_Rate": "206.1892167816866",
        "People_Tested": "125494",
        "People_Hospitalized": "1228",
        "Mortality_Rate": "4.033926354985519",
        "UID": "84000001",
        "ISO3": "USA",
        "Testing_Rate": "2676.4076924701053",
        "Hospitalization_Rate": "12.701696317749276"
    },
    {
        "Province_State": "Alaska",
        "Country_Region": "US",
        "date": "2020-05-10 02:32:34",
        "lat": "61.3707",
        "long": "-152.4044",
        "Confirmed": "378",
        "Deaths": "10",
        "Recovered": "318",
        "Active": "50.0",
        "FIPS": "2",
        "Incident_Rate": "63.23724506439994",
        "People_Tested": "26449",
        "People_Hospitalized": "",
        "Mortality_Rate": "2.6455026455026456",
        "UID": "84000002",
        "ISO3": "USA",
        "Testing_Rate": "4424.766917217762",
        "Hospitalization_Rate": ""
    },
    {
        "Province_State": "American Samoa",
        "Country_Region": "US",
        "date": "2020-05-10 02:32:34",
        "lat": "-14.270999999999999",
        "long": "-170.132",
        "Confirmed": "0",
        "Deaths": "0",
        "Recovered": "",
        "Active": "0.0",
        "FIPS": "60",
        "Incident_Rate": "0.0",
        "People_Tested": "83",
        "People_Hospitalized": "",
        "Mortality_Rate": "",
        "UID": "16",
        "ISO3": "ASM",
        "Testing_Rate": "149.17057565464316",
        "Hospitalization_Rate": ""
    }...

Upvotes: 0

Views: 60

Answers (2)

user120242
user120242

Reputation: 15268

Collects object data into an array under property .data based on same Province_State using a hashmap. Uses reduce.
Assumes that Province_State is a unique group identifier. Replace use of Province_State with whatever you want to use for grouping.

console.log(
Object.values( // discard keys
  data.reduce( (acc, {Province_State, lat, long, ...rest}) => ((
    // if [Province_State] already exists push object onto .data array
    acc[Province_State] && acc[Province_State].data.push(rest) ||
      // else add new object for key [Province_State]
      (acc[Province_State]={Province_State, lat, long, data:[rest]})
  ), acc), {})
)
)
<head><script>
var data =[
    {
        "Province_State": "Alabama",
        "Country_Region": "US",
        "date": "2020-05-10 02:32:34",
        "lat": "32.3182",
        "long": "-86.9023",
        "Confirmed": "9668",
        "Deaths": "390",
        "Recovered": "",
        "Active": "9278.0",
        "FIPS": "1",
        "Incident_Rate": "206.1892167816866",
        "People_Tested": "125494",
        "People_Hospitalized": "1228",
        "Mortality_Rate": "4.033926354985519",
        "UID": "84000001",
        "ISO3": "USA",
        "Testing_Rate": "2676.4076924701053",
        "Hospitalization_Rate": "12.701696317749276"
    },
    {
        "Province_State": "Alaska",
        "Country_Region": "US",
        "date": "2020-05-10 02:32:34",
        "lat": "61.3707",
        "long": "-152.4044",
        "Confirmed": "378",
        "Deaths": "10",
        "Recovered": "318",
        "Active": "50.0",
        "FIPS": "2",
        "Incident_Rate": "63.23724506439994",
        "People_Tested": "26449",
        "People_Hospitalized": "",
        "Mortality_Rate": "2.6455026455026456",
        "UID": "84000002",
        "ISO3": "USA",
        "Testing_Rate": "4424.766917217762",
        "Hospitalization_Rate": ""
    },
    {
        "Province_State": "American Samoa",
        "Country_Region": "US",
        "date": "2020-05-10 02:32:34",
        "lat": "-14.270999999999999",
        "long": "-170.132",
        "Confirmed": "0",
        "Deaths": "0",
        "Recovered": "",
        "Active": "0.0",
        "FIPS": "60",
        "Incident_Rate": "0.0",
        "People_Tested": "83",
        "People_Hospitalized": "",
        "Mortality_Rate": "",
        "UID": "16",
        "ISO3": "ASM",
        "Testing_Rate": "149.17057565464316",
        "Hospitalization_Rate": ""
    },
    {
        "Province_State": "Alabama",
        "Country_Region": "US",
        "date": "2020-05-10 02:32:40",
        "lat": "12.3182",
        "long": "-86.9023",
        "Confirmed": "9668",
        "Deaths": "390",
        "Recovered": "",
        "Active": "9278.0",
        "FIPS": "1",
        "Incident_Rate": "206.1892167816866",
        "People_Tested": "125494",
        "People_Hospitalized": "1228",
        "Mortality_Rate": "4.033926354985519",
        "UID": "84000001",
        "ISO3": "USA",
        "Testing_Rate": "2676.4076924701053",
        "Hospitalization_Rate": "12.701696317749276"
    }
 ]
 </script>

Upvotes: 1

brijmcq
brijmcq

Reputation: 3418

Here's a simplified version of creating your data property using reduce function.


   const formatted = data.map(
                area => {
                    return {
                        "state": area["Province_State"],
                        "lat": area["lat"],
                        "long": area["long"],
                        "data": Object.keys(area).reduce( (prev, next) => { 
                          prev[next]= area[next];                         
                        return prev;
                        } , {})
                    };
                }
        );

You have now a code where you don't need to explicitly write all the properties names because of this line

Object.keys(area).reduce( (prev, next) => { 
                          prev[next]= area[next];                         
                        return prev;
                        } , {})

I'm basically creating a new object and then create the properties dynamically since you can get the property names in Object.keys(area).

Here's a demo link https://playcode.io/600767/

Upvotes: 0

Related Questions