Javascript 如何合并多个多维JSON文件?

Javascript 如何合并多个多维JSON文件?,javascript,jquery,arrays,json,object,Javascript,Jquery,Arrays,Json,Object,我试图将多个JSON对象合并为一个,但我很难弄清楚如何获得所需的结果 我不太擅长创建复杂的for循环,这阻碍了我的成功 示例area1.json { data: [ { date: "2018031300", p: [ { lon: -5.55

我试图将多个JSON对象合并为一个,但我很难弄清楚如何获得所需的结果

我不太擅长创建复杂的for循环,这阻碍了我的成功

示例area1.json

        {
            data: [
                {
                    date: "2018031300",
                    p: [
                        {
                            lon: -5.555,
                            precip-intensity: 0,
                            wind-dir: 90.25001,
                            temperature: 3.7924042,
                            wind-speed: 8.692518,
                            weather-symbol: 3,
                            pressure-sealevel: 100247.5
                        },
                        {
                            lon: -4.444,
                            precip-intensity: 0,
                            wind-dir: 89.87501,
                            temperature: 3.1674042,
                            wind-speed: 8.731581,
                            weather-symbol: 3,
                            pressure-sealevel: 100238.5
                        }
                    ]
                },
                {
                    date: "2018031301",
                    p: [
                        {
                            lon: -5.555,
                            precip-intensity: 0.00390625,
                            wind-dir: 97.500015,
                            temperature: 3.6734467,
                            wind-speed: 8.874923,
                            weather-symbol: 3,
                            pressure-sealevel: 100265.625
                        },
                        {
                            lon: -4.444,
                            precip-intensity: 0.00390625,
                            wind-dir: 96.000015,
                            temperature: 3.1109467,
                            wind-speed: 9.066329,
                            weather-symbol: 3,
                            pressure-sealevel: 100260.625
                        }       
                    ]
                }
            ]
        }
示例area2.json

        {
            data: [
                {
                    date: "2018031300",
                    p: [
                        {
                            lon: -7.777,
                            precip-intensity: 0.0078125,
                            wind-dir: 96.25001,
                            temperature: 4.792404,
                            wind-speed: 10.200331,
                            weather-symbol: 3,
                            pressure-sealevel: 100237
                        },
                        {
                            lon: -6.666,
                            precip-intensity: 0,
                            wind-dir: 86.50001,
                            temperature: 4.167404,
                            wind-speed: 11.106581,
                            weather-symbol: 3,
                            pressure-sealevel: 100243
                        }
                        ]
                },
                {
                    date: "2018031301",
                    p: [
                        {
                            lon: -7.777,
                            precip-intensity: 0.03125,
                            wind-dir: 92.625015,
                            temperature: 4.7359467,
                            wind-speed: 11.066329,
                            weather-symbol: 3,
                            pressure-sealevel: 100242.125
                        },
                        {
                            lon: -6.666,
                            precip-intensity: 0.0078125,
                            wind-dir: 90.750015,
                            temperature: 4.2359467,
                            wind-speed: 11.24211,
                            weather-symbol: 3,
                            pressure-sealevel: 100269.625
                        }           
                        ]
                }
                ]
        }
这将是理想的结果

合并区域3.json

        {
            data: [
                {
                    date: "2018031300",
                    p: [
                        {
                            lon: -7.777,
                            precip-intensity: 0.0078125,
                            wind-dir: 96.25001,
                            temperature: 4.792404,
                            wind-speed: 10.200331,
                            weather-symbol: 3,
                            pressure-sealevel: 100237
                        },
                        {
                            lon: -6.666,
                            precip-intensity: 0,
                            wind-dir: 86.50001,
                            temperature: 4.167404,
                            wind-speed: 11.106581,
                            weather-symbol: 3,
                            pressure-sealevel: 100243
                        },
                        {
                            lon: -5.555,
                            precip-intensity: 0,
                            wind-dir: 90.25001,
                            temperature: 3.7924042,
                            wind-speed: 8.692518,
                            weather-symbol: 3,
                            pressure-sealevel: 100247.5
                        },
                        {
                            lon: -4.444,
                            precip-intensity: 0,
                            wind-dir: 89.87501,
                            temperature: 3.1674042,
                            wind-speed: 8.731581,
                            weather-symbol: 3,
                            pressure-sealevel: 100238.5
                        }
                    ]
                },
                {
                    date: "2018031301",
                    p: [
                        {
                            lon: -7.777,
                            precip-intensity: 0.03125,
                            wind-dir: 92.625015,
                            temperature: 4.7359467,
                            wind-speed: 11.066329,
                            weather-symbol: 3,
                            pressure-sealevel: 100242.125
                        },
                        {
                            lon: -6.666,
                            precip-intensity: 0.0078125,
                            wind-dir: 90.750015,
                            temperature: 4.2359467,
                            wind-speed: 11.24211,
                            weather-symbol: 3,
                            pressure-sealevel: 100269.625
                        },          
                        {
                            lon: -5.555,
                            precip-intensity: 0.00390625,
                            wind-dir: 97.500015,
                            temperature: 3.6734467,
                            wind-speed: 8.874923,
                            weather-symbol: 3,
                            pressure-sealevel: 100265.625
                        },
                        {
                            lon: -4.444,
                            precip-intensity: 0.00390625,
                            wind-dir: 96.000015,
                            temperature: 3.1109467,
                            wind-speed: 9.066329,
                            weather-symbol: 3,
                            pressure-sealevel: 100260.625
                        }       
                    ]
                }
            ]
        }
这个问题的答案就在那里。。。

我试着用这个代码

        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;
        }


        var finalJson = mergeJson({}, area1, area2);
函数mergeJson(目标){ for(var argi=1;argi
这给了我两个数组…

您复制粘贴了一个片段,该片段执行不同的合并。给定的合并执行以下操作:

{ a: [1, 2] } + { a: [3] } = { a: [1, 2, 3] }
您的数据格式要求更复杂的合并:

{ data: [ { key: "a", values: [1, 2] } ] } + 
{ data: [ { key: "a", values: [3] } ] } =
{ data: [ { key: "a", values: [1, 2, 3] }
松开第一个块中的逻辑,您将得到:

 { data: [ { key: "a", values: [1, 2] },
           { key: "a", values: [3] } ] }
正如你所说,这不是你想要的

这种比较应该清楚地表明,在开始合并之前,您需要找到一种方法来收集类似
值(
日期
)的数据

下面是一个示例实现,它在使用您提供的代码段时包含此预处理任务。注释中对代码进行了解释

vararea1={data:[{date:“2018031300”,p:[{lon:-5.555},{lon:-4.444}}},{date:“2018031301”,p:[{lon:-5.555},{lon:-4.444}]},area2={data:[{date date date:“2018031300”,p:[{lon lon lon 7.777},{-6.666},{date 2018031301,p:-7};
const mergeAreas=(区域1、区域2)=>{
//跳过结构中始终相同的部分:
const vals1=区域1.1数据;
const vals2=区域2.0数据;
//到{[日期]:点数}
const valObj1=arrayTobObject(x=>x.date,x=>x.p,vals1);
const valObj2=arrayToObject(x=>x.date,x=>x.p,vals2);
//使用您提供的策略进行合并:
const mergedObj=mergeJson({},valObj1,valObj2);
//返回原始格式:[{date,p}]
const mergedData=objToArray(([date,p])=>({date,p}),mergedObj);
//将其包装回基本结构:{data:[]}
返回{
数据:合并数据
}
};
//获取项目数组并返回单个对象。
//这些项存储在“getKey”返回的键中`
//这些项由`getValue'返回的值表示`
//当“getKey”返回重复项时,它将覆盖上一个条目
函数arrayToObject(getKey、getValue、xs){
返回xs.reduce(
(acc,x)=>Object.assign(acc,{[getKey(x)]:getValue(x)}),
{}
);
};
//这将获取一个对象并根据其条目返回一个数组
功能objToArray(kvpToItem,obj){
返回Object.entries(obj.map)(kvpToItem);
}
//由OP从答案中提供https://stackoverflow.com/a/16302909/3297291
函数mergeJson(目标){
for(var argi=1;argilog(finalJson)您复制粘贴了一个执行不同合并的代码段。给定的合并执行以下操作:

{ a: [1, 2] } + { a: [3] } = { a: [1, 2, 3] }
您的数据格式要求更复杂的合并:

{ data: [ { key: "a", values: [1, 2] } ] } + 
{ data: [ { key: "a", values: [3] } ] } =
{ data: [ { key: "a", values: [1, 2, 3] }
松开第一个块中的逻辑,您将得到:

 { data: [ { key: "a", values: [1, 2] },
           { key: "a", values: [3] } ] }
正如你所说,这不是你想要的

这种比较应该清楚地表明,在开始合并之前,您需要找到一种方法来收集类似
值(
日期
)的数据

下面是一个示例实现,它在使用您提供的代码段时包含此预处理任务。注释中对代码进行了解释

vararea1={data:[{date:“2018031300”,p:[{lon:-5.555},{lon:-4.444}}},{date:“2018031301”,p:[{lon:-5.555},{lon:-4.444}]},area2={data:[{date date date:“2018031300”,p:[{lon lon lon 7.777},{-6.666},{date 2018031301,p:-7};
const mergeAreas=(区域1、区域2)=>{
//跳过结构中始终相同的部分:
const vals1=区域1.1数据;
const vals2=区域2.0数据;
//到{[日期]:点数}
const valObj1=arrayTobObject(x=>x.date,x=>x.p,vals1);
const valObj2=arrayToObject(x=>x.date,x=>x.p,vals2);
//使用您提供的策略进行合并:
const mergedObj=mergeJson({},valObj1,valObj2);
//返回原始格式:[{date,p}]
const mergedData=objToArray(([date,p])=>({date,p}),mergedObj);
//将其包装回基本结构:{data:[]}
返回{
数据:合并数据
}
};
//获取项目数组并返回单个对象。
//这些项存储在“getKey”返回的键中`
//这些项由`getValue'返回的值表示`
//当“getKey”返回重复项时,它将覆盖上一个条目
函数arrayToObject(getKey、getValue、xs){
返回xs.reduce(
(acc,x)=>Object.assign(acc,{[getKey(x)]:getValue(x)}),
{}
);
};
//这将获取一个对象并根据其条目返回一个数组
功能objToArray(kvpToItem,obj){
返回Object.entries(obj.map)(kvpToItem);
}
//由OP从答案中提供https://stackoverflow.com/a/16302909/3297291
函数mergeJson(目标){
for(var argi=1;argi