admin管理员组

文章数量:1389778

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 binedJSON.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"
            }
        }
    ]
}

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 binedJSON.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"
            }
        }
    ]
}
Share Improve this question asked Apr 30, 2013 at 14:44 bsiddiquibsiddiqui 1,9265 gold badges25 silver badges36 bronze badges 4
  • Iterate over the object (stackoverflow./q/85992/218196) and merge the arrays (stackoverflow./q/1584370/218196). – Felix Kling Commented Apr 30, 2013 at 14:47
  • have you looked into one of the small utility js libraries, like Underscore or Lodash: underscorejs lodash./docs they have lots of collection manipulation functions – djKianoosh 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. – HMR Commented Apr 30, 2013 at 15:11
  • Does this answer your question? Merge two array of objects based on a key – Henke Commented Mar 18, 2021 at 9:56
Add a ment  | 

1 Answer 1

Reset to default 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/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/4nfWp/4/

Credit goes to @djKianoosh for figuring that out :)

本文标签: javascriptMerge JSON Data by KeyStack Overflow