根据唯一ID合并geojson

时间:2015-03-24 22:30:57

标签: javascript json join merge

我是Javascript的初学者,所以请放弃这个可能是愚蠢的问题。我想基于唯一对象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中的元素顺序不同,并且第二个Json中的元素不存在于第二个中。

结果应如下所示:

"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}}}

1 个答案:

答案 0 :(得分:1)

这将完成这项工作:

    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()逐个运行'features'数组。

然后我们在features2数组上使用Array.filter(),它为我们提供了一个数组,其中包含features2(匹配[0])中唯一与object.id具有相同ID的对象。

如果匹配,那么我们使用'for in'循环遍历features2对象中的'properties'并将它们复制到'feature'对象。


如果您想获得有关此问题的高级信息,请查看此stackoverflow问题:How can I merge properties of two JavaScript objects dynamically?。例如,如果您正在编写防弹javascript,则应在for循环中使用'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];
            }
        }
    }
}