0

I am trying to merge several JSON files I have on weather data and am trying to figure out the best way to do it. I've found several other posts that just concatenate the JSON objects or that have the second one overwrite the first in case of the same key, etc but nothing that merges them by key.

Below is a sample of what I'm working with and the output I'd like. Any suggestions on this would be great!

Sample JSON0.json

    {
    "1948": [
        {
            "Seattle": {
                "city": "Seattle",
                "data": {
                    "avg_dew_point": "34",
                    "avg_gust_wind": "",
                    "avg_max_temp": "45",
                    "avg_min_temp": "35",
                    "avg_precipitation": "0.00",
                    "avg_sea_level_pressure": "30.22",
                    "avg_temp": "40",
                    "avg_wind": "8"
                },
                "month": "1",
                "state": "WA"
            }
        },
        {
            "Chicago": {
                "city": "Chicago",
                "data": {
                    "avg_dew_point": "10",
                    "avg_gust_wind": "",
                    "avg_max_temp": "25",
                    "avg_min_temp": "11",
                    "avg_precipitation": "0.00",
                    "avg_sea_level_pressure": "30.17",
                    "avg_temp": "18",
                    "avg_wind": "12"
                },
                "month": "1",
                "state": "IL"
            }
        }
    ],
    "1949": [
        {
            "Houston": {
                "city": "Houston",
                "data": {
                    "avg_dew_point": "45",
                    "avg_gust_wind": "",
                    "avg_max_temp": "61",
                    "avg_min_temp": "44",
                    "avg_precipitation": "0.00",
                    "avg_sea_level_pressure": "30.15",
                    "avg_temp": "53",
                    "avg_wind": "12"
                },
                "month": "1",
                "state": "TX"
            }
        },
        {
            "Seattle": {
                "city": "Seattle",
                "data": {
                    "avg_dew_point": "25",
                    "avg_gust_wind": "",
                    "avg_max_temp": "38",
                    "avg_min_temp": "25",
                    "avg_precipitation": "0.00",
                    "avg_sea_level_pressure": "30.32",
                    "avg_temp": "31",
                    "avg_wind": "7"
                },
                "month": "1",
                "state": "WA"
            }
        }
    ]
}

Sample JSON1.json

{
    "1948": [
        {
            "Jacksonville": {
                "city": "Jacksonville",
                "data": {
                    "avg_dew_point": "45",
                    "avg_gust_wind": "",
                    "avg_max_temp": "61",
                    "avg_min_temp": "44",
                    "avg_precipitation": "0.00",
                    "avg_sea_level_pressure": "30.13",
                    "avg_temp": "53",
                    "avg_wind": "8"
                },
                "month": "1",
                "state": "FL"
            }
        },
        {
            "Indianapolis": {
                "city": "Indianapolis",
                "data": {
                    "avg_dew_point": "13",
                    "avg_gust_wind": "",
                    "avg_max_temp": "34",
                    "avg_min_temp": "13",
                    "avg_precipitation": "0.00",
                    "avg_sea_level_pressure": "30.17",
                    "avg_temp": "24",
                    "avg_wind": "12"
                },
                "month": "1",
                "state": "IN"
            }
        }
    ],
    "1949": [
        {
            "San Jose": {
                "city": "San Jose",
                "data": {
                    "avg_dew_point": "",
                    "avg_gust_wind": "",
                    "avg_max_temp": "52",
                    "avg_min_temp": "33",
                    "avg_precipitation": "0.02",
                    "avg_sea_level_pressure": "",
                    "avg_temp": "43",
                    "avg_wind": ""
                },
                "month": "1",
                "state": "CA"
            }
        },
        {
            "Jacksonville": {
                "city": "Jacksonville",
                "data": {
                    "avg_dew_point": "55",
                    "avg_gust_wind": "",
                    "avg_max_temp": "73",
                    "avg_min_temp": "54",
                    "avg_precipitation": "0.00",
                    "avg_sea_level_pressure": "30.21",
                    "avg_temp": "63",
                    "avg_wind": "5"
                },
                "month": "1",
                "state": "FL"
            }
        }
    ]
}

Sample combinedJSON.json

{
    "1948": [
        {
            "Seattle": {
                "city": "Seattle",
                "data": {
                    "avg_dew_point": "34",
                    "avg_gust_wind": "",
                    "avg_max_temp": "45",
                    "avg_min_temp": "35",
                    "avg_precipitation": "0.00",
                    "avg_sea_level_pressure": "30.22",
                    "avg_temp": "40",
                    "avg_wind": "8"
                },
                "month": "1",
                "state": "WA"
            }
        },
        {
            "Chicago": {
                "city": "Chicago",
                "data": {
                    "avg_dew_point": "10",
                    "avg_gust_wind": "",
                    "avg_max_temp": "25",
                    "avg_min_temp": "11",
                    "avg_precipitation": "0.00",
                    "avg_sea_level_pressure": "30.17",
                    "avg_temp": "18",
                    "avg_wind": "12"
                },
                "month": "1",
                "state": "IL"
            }
        },
        {
            "Jacksonville": {
                "city": "Jacksonville",
                "data": {
                    "avg_dew_point": "45",
                    "avg_gust_wind": "",
                    "avg_max_temp": "61",
                    "avg_min_temp": "44",
                    "avg_precipitation": "0.00",
                    "avg_sea_level_pressure": "30.13",
                    "avg_temp": "53",
                    "avg_wind": "8"
                },
                "month": "1",
                "state": "FL"
            }
        },
        {
            "Indianapolis": {
                "city": "Indianapolis",
                "data": {
                    "avg_dew_point": "13",
                    "avg_gust_wind": "",
                    "avg_max_temp": "34",
                    "avg_min_temp": "13",
                    "avg_precipitation": "0.00",
                    "avg_sea_level_pressure": "30.17",
                    "avg_temp": "24",
                    "avg_wind": "12"
                },
                "month": "1",
                "state": "IN"
            }
        }
    ],
    "1949": [
        {
            "Houston": {
                "city": "Houston",
                "data": {
                    "avg_dew_point": "45",
                    "avg_gust_wind": "",
                    "avg_max_temp": "61",
                    "avg_min_temp": "44",
                    "avg_precipitation": "0.00",
                    "avg_sea_level_pressure": "30.15",
                    "avg_temp": "53",
                    "avg_wind": "12"
                },
                "month": "1",
                "state": "TX"
            }
        },
        {
            "Seattle": {
                "city": "Seattle",
                "data": {
                    "avg_dew_point": "25",
                    "avg_gust_wind": "",
                    "avg_max_temp": "38",
                    "avg_min_temp": "25",
                    "avg_precipitation": "0.00",
                    "avg_sea_level_pressure": "30.32",
                    "avg_temp": "31",
                    "avg_wind": "7"
                },
                "month": "1",
                "state": "WA"
            }
        },
        {
            "San Jose": {
                "city": "San Jose",
                "data": {
                    "avg_dew_point": "",
                    "avg_gust_wind": "",
                    "avg_max_temp": "52",
                    "avg_min_temp": "33",
                    "avg_precipitation": "0.02",
                    "avg_sea_level_pressure": "",
                    "avg_temp": "43",
                    "avg_wind": ""
                },
                "month": "1",
                "state": "CA"
            }
        },
        {
            "Jacksonville": {
                "city": "Jacksonville",
                "data": {
                    "avg_dew_point": "55",
                    "avg_gust_wind": "",
                    "avg_max_temp": "73",
                    "avg_min_temp": "54",
                    "avg_precipitation": "0.00",
                    "avg_sea_level_pressure": "30.21",
                    "avg_temp": "63",
                    "avg_wind": "5"
                },
                "month": "1",
                "state": "FL"
            }
        }
    ]
}
bsiddiqui
  • 1,886
  • 5
  • 25
  • 35
  • Iterate over the object (http://stackoverflow.com/q/85992/218196) and merge the arrays (http://stackoverflow.com/q/1584370/218196). – Felix Kling Apr 30 '13 at 14:47
  • have you looked into one of the small utility js libraries, like Underscore or Lodash: http://underscorejs.org/ http://lodash.com/docs they have lots of collection manipulation functions – djKianoosh Apr 30 '13 at 14:50
  • You might considor stepping into jQuery extend, get the unminified version of jquery, write code like $.extend(true,{a:"a"},{b:"b"}); press F12 and set a breakpoint there, load the page and step into the code. There is quite a bit of code involved but it does a good job at deep copying objects, functions involved for objects that don't contain arrays or functions are: extend, isPlainObject and type. – HMR Apr 30 '13 at 15:11
  • Does this answer your question? [Merge two array of objects based on a key](https://stackoverflow.com/questions/46849286/merge-two-array-of-objects-based-on-a-key) – Henke Mar 18 '21 at 09:56

1 Answers1

3

Try this:

function mergeJson(target) {
    for (var argi = 1; argi < arguments.length; argi++) {
        var source = arguments[argi];
        for (var key in source) {
            if (!(key in target)) {
                target[key] = [];
            }
            for (var i = 0; i < source[key].length; i++) {
                target[key].push(source[key][i]);
            }
        }
    }
    return target;
}

DEMO: http://jsfiddle.net/4nfWp/1/

And you call it like: mergeJson({}, object1, object2, object3); (with any number of arguments past the 1st)

In the demo, the actual call is at the bottom of the Javascript because I need the "JSON" to be defined first, and they're long.

UPDATE:

If using underscorejs, you can use something like:

var finalJson = {};
_.each(_.keys(json0,json1), function(key) {
    finalJson[key] = _.flatten(_.zip(json0[key], json1[key]));
});
console.log(finalJson);

DEMO: http://jsfiddle.net/4nfWp/4/

Credit goes to @djKianoosh for figuring that out :)

Ian
  • 50,146
  • 13
  • 101
  • 111
  • I tweaked the jsfiddle to use underscore's zip/each/flatten functions to see if it would work using those: http://jsfiddle.net/4nfWp/3/ – djKianoosh Apr 30 '13 at 15:14
  • @djKianoosh Very cool, thanks for working on it and figuring it out. I pulled it all together, and updated my answer to include the fiddle and gave you credit :) I've never worked with `underscorejs` so that solution never would've crossed my mind. At the same time, you're obviously welcome to make your own answer, because it works – Ian Apr 30 '13 at 15:20