我是Java语言的初学者,所以请原谅这个可能很愚蠢的问题。我想基于唯一的对象ID合并两个json文件。

第一位看起来像这样:

"features": [{
      "id": "3876802",
      "properties": {
        "name": "some name",
        "facts": "some facts"}},
      {"id": "3876803",
      "properties": {"name":"another name"...}}...]


第二个看起来像这样:

"features": [{
          "id": "3876803",
          "properties": {
          "description": "some description",
          "website": "afancywebsite"}},
         {"id": "3876803",
          "properties": {...}}]


第二个Json中的Elements顺序不相同,并且第一个文件中的所有元素都不都在第二个中。

结果应如下所示:

"features": [{
          "id": "3876802",
          "properties": {
            "name": "some name",
            "facts": "some facts"}},{
          "id": "3876803",
          "properties": {
            "name":"another name",
            "description": "some description",
            "website": "afancywebsite"}}]


我开始对此进行编码,但我不知道如何使其工作。

 for(var i in json1.features){
        for (var z in json2.features){
        if (json1.features[i].id===json2.features[z].id){
            json1.feature[i].properties = json2.features[z].properties}}}

最佳答案

这将完成工作:

    var features =  [
    {"id": "3876802",
        "properties": {
            "name": "some name",
            "facts": "some facts"}
    },
    {"id": "3876803",
        "properties": {
            "name":"another name"
        }
    }
    ];


    var features2 = [{
        "id": "3876803",
        "properties": {
            "description": "some description",
            "website": "afancywebsite"
            }
        }
    ];


features.map(function(feature){
    var matchedArray = features2.filter(function(feature2){
        return feature2.id === feature.id;
    });
    if(matchedArray && matchedArray[0]){
        for(var attr in matchedArray[0].properties){
            feature.properties[attr] = matchedArray[0].properties[attr];
        }
    }
});


我们首先使用Array.map()逐一运行“功能”数组。

然后,在features2数组上使用Array.filter(),这将为我们提供一个数组,其中包含features2中唯一的对象(matched [0]),该对象的ID与feature.id相同。

如果匹配,则使用“ for in”循环遍历features2对象中的“ properties”,然后将其复制到“ feature”对象。



如果要获取有关此内容的高级信息,请查看以下stackoverflow问题:How can I merge properties of two JavaScript objects dynamically?。例如,如果您正在编写防弹JavaScript,则应在for in循环中使用“ hasOwnProperty”。
您可能还想防止'features2'中的属性覆盖'features'中具有相同名称的属性。



但是,如果您希望保留或多或少的代码,也可以这样做:

for(var i in features){
    for (var z in features2){
        if (features[i].id===features2[z].id){
            for(var attr in features2[z].properties){
                features[i].properties[attr] = features2[z].properties[attr];
            }
        }
    }
}

09-25 19:13