Javascript 从多个JSON文件向一个JSON对象追加键和值
我目前正在处理三个json文件 master.jsonJavascript 从多个JSON文件向一个JSON对象追加键和值,javascript,python,json,Javascript,Python,Json,我目前正在处理三个json文件 master.json { "master":[ { "sport": "soccer", "id": 1 }, { "sport": "football", "id": 2 } ] } data1.json { "soccer": { "players": 11 }, "football": { "players": 12 } } dat
{
"master":[
{
"sport": "soccer",
"id": 1
},
{
"sport": "football",
"id": 2
}
]
}
data1.json
{
"soccer": {
"players": 11
},
"football": {
"players": 12
}
}
data2.json
{
"soccer": {
"stadiums": {
"away": "StadiumA",
"home": "StadiumB"
}
},
"football": {
"stadiums": {
"away": "StadiumA",
"home": "StadiumB"
}
}
}
我想做的是将每个json文件中每个运动的属性组合到master.json
中
这就是我要找的:
{
"master":[
{
"sport": "soccer",
"id": 1,
"players": 11,
"stadiums": {
"away": "StadiumA",
"home": "StadiumB"
}
},
{
"sport": "football",
"id": 2,
"players": 12,
"stadiums": {
"away": "StadiumA",
"home": "StadiumB"
}
}
]
}
理想情况下,我希望能够包含一个条件,其中data1
和data2
中的运动值必须与master.json
中的值匹配才能进行追加。因此,如果“棒球”在data1
和data2
中,但不在master
中,则不包括它
我曾尝试在JavaScript中使用下划线
,在Python中使用json
,但没有成功。我似乎找不到一种方法来循环浏览所有三个json文件,让它们彼此对话,尤其是看这项运动是否匹配
任何帮助都将不胜感激。我也会尽我最大的努力澄清和混淆 这样就可以了。请记住,这是你的案子
var master = {
"master":[
{
"sport": "soccer",
"id": 1
},
{
"sport": "football",
"id": 2
}
]
}
var data1 = {
"soccer": {
"players": 11
},
"football": {
"players": 12
}
}
var data2 = {
"soccer": {
"stadiums": {
"away": "StadiumA",
"home": "StadiumB"
}
},
"football": {
"stadiums": {
"away": "StadiumA",
"home": "StadiumB"
}
}
}
var masterSports = master.master.map(function(object){
return object.sport;
});
var data1Keep = {};
var data2Keep = {};
Object.keys(data1).map(function(key){
if(masterSports.indexOf(key) > -1 && !data1Keep.hasOwnProperty(key)){
data1Keep[key] = data1[key];
}
});
Object.keys(data2).map(function(key){
if(masterSports.indexOf(key) > -1 && !data2Keep.hasOwnProperty(key)){
data2Keep[key] = data2[key];
}
});
master.master.map(function(object){
for(key in data1Keep){
if(key == object.sport){
for(i in data1Keep[key]){
object[i] = data1Keep[key][i];
}
}
}
for(key2 in data2Keep){
if(key2 == object.sport){
for(j in data2Keep[key2]){
object[j] = data2Keep[key2][j];
}
}
}
return object;
});
这就行了。请记住,这是你的案子
var master = {
"master":[
{
"sport": "soccer",
"id": 1
},
{
"sport": "football",
"id": 2
}
]
}
var data1 = {
"soccer": {
"players": 11
},
"football": {
"players": 12
}
}
var data2 = {
"soccer": {
"stadiums": {
"away": "StadiumA",
"home": "StadiumB"
}
},
"football": {
"stadiums": {
"away": "StadiumA",
"home": "StadiumB"
}
}
}
var masterSports = master.master.map(function(object){
return object.sport;
});
var data1Keep = {};
var data2Keep = {};
Object.keys(data1).map(function(key){
if(masterSports.indexOf(key) > -1 && !data1Keep.hasOwnProperty(key)){
data1Keep[key] = data1[key];
}
});
Object.keys(data2).map(function(key){
if(masterSports.indexOf(key) > -1 && !data2Keep.hasOwnProperty(key)){
data2Keep[key] = data2[key];
}
});
master.master.map(function(object){
for(key in data1Keep){
if(key == object.sport){
for(i in data1Keep[key]){
object[i] = data1Keep[key][i];
}
}
}
for(key2 in data2Keep){
if(key2 == object.sport){
for(j in data2Keep[key2]){
object[j] = data2Keep[key2][j];
}
}
}
return object;
});
为了演示Python的相对技巧,我将引入一个解决方案:
import json
from collections import OrderedDict
with open('master.json') as m, open('data1.json') as d1, open('data2.json') as d2:
master = json.load(m, object_pairs_hook=OrderedDict)
data1 = json.load(d1, object_pairs_hook=OrderedDict)
data2 = json.load(d2, object_pairs_hook=OrderedDict)
for i, obj in enumerate(master['master']):
d1, d2 = data1.get(obj['sport']), data2.get(obj['sport'])
if d1:
master['master'][i].update(d1)
if d2:
master['master'][i].update(d2)
print(json.dumps(master,indent=2))
输出:
{
"master": [
{
"sport": "soccer",
"id": 1,
"players": 11,
"stadiums": {
"away": "StadiumA",
"home": "StadiumB"
}
},
{
"sport": "football",
"id": 2,
"players": 12,
"stadiums": {
"away": "StadiumA",
"home": "StadiumB"
}
}
]
}
为了演示Python的相对技巧,我将引入一个解决方案:
import json
from collections import OrderedDict
with open('master.json') as m, open('data1.json') as d1, open('data2.json') as d2:
master = json.load(m, object_pairs_hook=OrderedDict)
data1 = json.load(d1, object_pairs_hook=OrderedDict)
data2 = json.load(d2, object_pairs_hook=OrderedDict)
for i, obj in enumerate(master['master']):
d1, d2 = data1.get(obj['sport']), data2.get(obj['sport'])
if d1:
master['master'][i].update(d1)
if d2:
master['master'][i].update(d2)
print(json.dumps(master,indent=2))
输出:
{
"master": [
{
"sport": "soccer",
"id": 1,
"players": 11,
"stadiums": {
"away": "StadiumA",
"home": "StadiumB"
}
},
{
"sport": "football",
"id": 2,
"players": 12,
"stadiums": {
"away": "StadiumA",
"home": "StadiumB"
}
}
]
}
我试着在节点中要求json文件,并在下划线中循环它们。我也尝试过用Python来处理它们。我在使用一个对象数组时没有遇到任何问题,但我一直在学习如何处理三个。向我们展示您的代码!请展示您最近的一次尝试。为什么,哦,为什么,您要制作一个json,它是一个包含单例对象的数组的单个对象?为什么不像
{'soccer':{'id':1},'football':{'id':2}
?我已经尝试在节点中要求json文件,并在下划线中循环它们。我也尝试过用Python来处理它们。我在使用一个对象数组时没有遇到任何问题,但我一直在学习如何处理三个。向我们展示您的代码!请展示您最近的一次尝试。为什么,哦,为什么,您要制作一个json,它是一个包含单例对象的数组的单个对象?为什么不像{'soccer':{'id':1},'football':{'id':2}
?感谢您的回复!我使用了python解决方案,但我感谢您的JS贡献。它看起来更简单、更好,所以我不怪您。感谢您的回复!我使用了python解决方案,但我感谢您的JS贡献。它看起来更简单、更好,所以我不怪您。不客气。我更新了答案,我刚刚意识到在使用dicts
更新master之前不需要复制它们。我只是太小心了,不用客气。我更新了答案,我刚刚意识到在使用dicts
更新master之前不需要复制它们。我只是太小心了。