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"
            }
        }
    ]
}
4
  • Iterate over the object (stackoverflow.com/q/85992/218196) and merge the arrays (stackoverflow.com/q/1584370/218196). Commented Apr 30, 2013 at 14:47
  • have you looked into one of the small utility js libraries, like Underscore or Lodash: underscorejs.org lodash.com/docs they have lots of collection manipulation functions Commented Apr 30, 2013 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. Commented Apr 30, 2013 at 15:11
  • Does this answer your question? Merge two array of objects based on a key Commented Mar 18, 2021 at 9:56

1 Answer 1

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 :)

Sign up to request clarification or add additional context in comments.

2 Comments

I tweaked the jsfiddle to use underscore's zip/each/flatten functions to see if it would work using those: jsfiddle.net/4nfWp/3
@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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.