将json作为子文档合并到另一个json中
Merge json into another json as subdocument
我想合并两个json文件,使第二个json中匹配的stop_id
嵌套为第一个json的子文档。
这就是我的意思:
first.json:例如,这是一个json文件,包含火车的车站停靠站。每个都有一个stop_id
字段。
[
{
"stop_id":70021,
"stop_name":"CALTRAIN - 22ND ST STATION",
"stop_lat":37.757692,
"stop_lon":-122.392318,
"zone_id":3329
},
{
"stop_id":70022,
"stop_name":"CALTRAIN - 22ND ST STATION",
"stop_lat":37.757692,
"stop_lon":-122.392318,
"zone_id":3329
},
{
"stop_id":70151,
"stop_name":"CALTRAIN - ATHERTON STATION",
"stop_lat":37.464458,
"stop_lon":-122.198152,
"zone_id":3331
}]
second.json:通过stop_id
包含与车站相关的行程信息
[
{
"trip_id":"RTD8997283",
"arrival_time":"05:40:00",
"departure_time":"05:40:00",
"stop_id":70021,
"stop_sequence":1
},
{
"trip_id":"RTD8997283",
"arrival_time":"05:52:00",
"departure_time":"05:52:00",
"stop_id":70021,
"stop_sequence":2
},
{
"trip_id":"RTD8449096",
"arrival_time":"07:33:00",
"departure_time":"07:33:00",
"stop_id":70022,
"stop_sequence":1
}]
我想合并这些文档,使second.json中匹配的stop_id
s嵌套在first.json中的stop_id
文档下面
merged.json
[{
"stop_id": 70021,
"stop_name": "CALTRAIN - 22ND ST STATION",
"stop_lat": 37.757692,
"stop_lon": -122.392318,
"zone_id": 3329,
"trip": [{
"trip_id": "RTD8997283",
"arrival_time": "05:40:00",
"departure_time": "05:40:00",
"stop_id": 70021,
"stop_sequence": 1
}, {
"trip_id": "RTD8997283",
"arrival_time": "05:52:00",
"departure_time": "05:52:00",
"stop_id": 70021,
"stop_sequence": 2
}]
}, {
"stop_id": 70022,
"stop_name": "CALTRAIN - 22ND ST STATION",
"stop_lat": 37.757692,
"stop_lon": -122.392318,
"zone_id": 3329,
"trip": [{
"trip_id": "RTD8449096",
"arrival_time": "07:33:00",
"departure_time": "07:33:00",
"stop_id": 70022,
"stop_sequence": 1
}]
}, {
"stop_id": 70151,
"stop_name": "CALTRAIN - ATHERTON STATION",
"stop_lat": 37.464458,
"stop_lon": -122.198152,
"zone_id": 3331
}]
对于大型数据集,有什么方法可以通过javascript或任何其他方法进行此类合并?
您可以array.forEach
。
first.forEach(function (val, index, theArray) {
val.trip = [];
second.forEach(function (val2, index, theArray) {
if(val2.stop_id === val.stop_id){
val.trip.push(val2);
}
});
});
console.log(first);
一把可以摆弄的小提琴。https://jsfiddle.net/u3etdqrz/3/
您可以尝试以下操作:
var stnList = [{"stop_id": 70021,"stop_name": "CALTRAIN - 22ND ST STATION", "stop_lat": 37.757692,"stop_lon": -122.392318,"zone_id": 3329}, { "stop_id": 70022, "stop_name": "CALTRAIN - 22ND ST STATION", "stop_lat": 37.757692, "stop_lon": -122.392318, "zone_id": 3329}, { "stop_id": 70151, "stop_name": "CALTRAIN - ATHERTON STATION", "stop_lat": 37.464458, "stop_lon": -122.198152, "zone_id": 3331}];
var travelList = [{ "trip_id": "RTD8997283", "arrival_time": "05:40:00", "departure_time": "05:40:00", "stop_id": 70021, "stop_sequence": 1}, { "trip_id": "RTD8997283", "arrival_time": "05:52:00", "departure_time": "05:52:00", "stop_id": 70021, "stop_sequence": 2}, { "trip_id": "RTD8449096", "arrival_time": "07:33:00", "departure_time": "07:33:00", "stop_id": 70022, "stop_sequence": 1}]
travelList.forEach(function(t) {
// Find oobject
var _stn = stnList.find(function(stn) {
return stn.stop_id === t.stop_id
});
// check if trip property is defined or not
if (!_stn.trip) _stn.trip = [];
_stn.trip.push(t);
});
document.write("<pre>" + JSON.stringify(stnList, 0, 4) + "</pre>");
在纯Javascript中,您可以使用一个临时对象作为对目标项的引用,并将所有行程推送到另一个循环中。
此解决方案假定stop_id
在两个阵列中都匹配。
function merge(array1, array2) {
var o = {};
array1.forEach(function (a) {
o[a.stop_id] = a;
});
array2.forEach(function (a) {
o[a.stop_id].trip = o[a.stop_id].trip || [];
o[a.stop_id].trip.push(a);
});
}
var array1 = [{ "stop_id": 70021, "stop_name": "CALTRAIN - 22ND ST STATION", "stop_lat": 37.757692, "stop_lon": -122.392318, "zone_id": 3329 }, { "stop_id": 70022, "stop_name": "CALTRAIN - 22ND ST STATION", "stop_lat": 37.757692, "stop_lon": -122.392318, "zone_id": 3329 }, { "stop_id": 70151, "stop_name": "CALTRAIN - ATHERTON STATION", "stop_lat": 37.464458, "stop_lon": -122.198152, "zone_id": 3331 }],
array2 = [{ "trip_id": "RTD8997283", "arrival_time": "05:40:00", "departure_time": "05:40:00", "stop_id": 70021, "stop_sequence": 1 }, { "trip_id": "RTD8997283", "arrival_time": "05:52:00", "departure_time": "05:52:00", "stop_id": 70021, "stop_sequence": 2 }, { "trip_id": "RTD8449096", "arrival_time": "07:33:00", "departure_time": "07:33:00", "stop_id": 70022, "stop_sequence": 1 }];
merge(array1, array2);
document.write('<pre>' + JSON.stringify(array1, 0, 4) + '</pre>');
如果浏览器支持不是问题,Array.prototype.find
可能是这种情况的最佳解决方案。
for (let item1 of arr1) {
item1.trip = arr2.find(item2 => item2.stopid === item1.stopid);
}
这里有一个使用Array.prototype.map()
的小线性,假设第一个JSON样本存储在stops
中,第二个存储在trips
中。(注意:它需要一个对象扩展函数。我使用了jQuery的$.extend()
,但任何对象扩展方法都可以,例如Undercore/Lodash的_.extend()
或Node.js的util._extend
。)
var merged = stops.map(function(stop){ return $.extend({}, stop, {trip: trips.filter(function(trip) { return trip.stop_id === stop.stop_id; })}); })
如果你喜欢ES6的箭头功能,你可以把它做得更漂亮一点:
var merged = stops.map(stop=>$.extend({}, stop, {trip: trips.filter(trip => trip.stop_id === stop.stop_id)}))
这两种方法都会使原始数组保持不变,但如果您只是想将行程合并到站点中,而不关心保留原始数组,则可以删除$.extend()
的第一个参数;这更有效(尤其是对于非常大的数据集),并且您不必担心将其保存在一个变量中:
stops.map(stop=>$.extend(stop, {trip: trips.filter(trip => trip.stop_id === stop.stop_id)}))
与stop_id
匹配的站点阵列中的trains
和filter
上的map
。
function getStations(stations, id) {
return stations.filter(function(obj) {
return obj.stop_id === id;
});
}
function mergeInfo(trains, stations) {
return trains.map(function(obj) {
var filtered = getStations(stations, obj.stop_id);
if (filtered.length) obj.trip = filtered;
return obj;
});
}
var output = mergeInfo(trains, stations);
演示
- JSON:在另一个JSON对象中重用JSON对象
- 如何使用AJAX和JSON从一个页面抓取PHP变量到另一个页面
- 将错误消息 JSON 传递到另一个页面模板
- 从另一个JSON对象创建JSON对象
- 在没有jsonp的情况下从另一个域获取数据(json格式)
- 将服务器的json响应克隆到另一个变量中
- 将json作为子文档合并到另一个json中
- 如何使用javascript将json数据从一个html页面传递到另一个html页
- 同步函数调用涉及post-json调用,其中一个函数应该在另一个函数成功后成功
- 将json数据发送到另一个url-在您'我从我自己的网址上得到的
- 如何将JSON数组数据从一个JS函数发送到另一个
- 从另一个 JSON 对象数组创建 JSON 对象数组
- 如何从另一个网站加载 .json 文件
- 将数据从一个 json 对象动态添加到另一个 json 对象
- 如何从另一个视图上编写的 JS 代码重定向到控制器,并将 JSON 对象随之传递
- 如何在Symfony中读取另一个文件夹中的内容json文件
- 如何一起解析另一个 JSON 中的 JSON
- 如何从另一个 json 对象为 json 对象设置值
- 如何将另一个 JSON 中的 JSON 对象移动到最后一个位置
- 如何获取基于另一个属性的 JSON 属性