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