Javascript 从多个JSON文件向一个JSON对象追加键和值

Javascript 从多个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

我目前正在处理三个json文件

master.json

 {
  "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之前不需要复制它们。我只是太小心了。