2015-03-24 94 views
0

我是一個Javascript初學者,所以請刪除這可能愚蠢的問題。我想合併兩個基於唯一對象ID的json文件。基於唯一ID合併geojson

號碼一點看是這樣的:

"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的元素不是以相同的順序,第一個文件的並非所有元素存在於第二個。

的結果應該是這樣的:

"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

這將做的工作:

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])中唯一對象的數組,該數組與feature.id具有相同的id。

如果存在匹配,那麼我們使用'for in'循環遍歷features2對象中的'屬性'並將它們複製到'feature'對象中。


如果你想獲得這種先進的信息看看這個計算器的問題: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]; 
      } 
     } 
    } 
} 
+0

謝謝,完美的作品 – hno2 2015-03-25 11:31:26