javascript - 传单中的 geojson 和 json 无法连接在一起

标签 javascript json dictionary join leaflet

使用此代码将信息传输到 map :

function join(){            
    $.when(
        $.getJSON('bairro.json'),
        $.getJSON('convertJson.php')
    ).done(function(responseGeojson, responseData) {
        var data = responseData[0]
        var geojson = responseGeojson[0]

        // Create hash table for easy reference
        var dataHash = {}
        console.log('==data==');
        console.log(data);
        data.forEach(function(item) {
            if(item.cod) 
            dataHash[item.cod] = item.cod;
            if(item.nome) 
            dataHash[item.nome] = item.nome;
            if(item.local) 
            dataHash[item.local] = item.local;

        })
        // Add value from hash table to geojson properties
        geojson.features.forEach(function(item) {
            console.log('-->' + dataHash[item.properties.nome]);
            item.properties.Codigo = +dataHash[item.properties.cod]   || null
            item.properties.Nome   = +dataHash[item.properties.nome]  || null
            item.properties.Local  = +dataHash[item.properties.local] || null

        })

    })
}

但它返回未定义的值,并且 map 上没有出现图像。

Geojson 看起来像:

{"type": "FeatureCollection",
"features": [
{ "type": "Feature", "properties": { "NOME": "local1", "REGIAO_ADM": "value1", "CODBAIRRO": "13"}, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 694555.509827277157456, 7483079.800010865554214 ], [ 694554.849827276892029, 7483077.34010686352849 ], [ 694551.869923274731264, 7483076.470026861876249 ],...}
{ "type": "Feature", "properties": { "NOME": "local2", "REGIAO_ADM": "value2", "CODBAIRRO": "13"}, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 694555.509827277157456, 7483079.800010865554214 ], [ 694554.849827276892029, 7483077.34010686352849 ], [ 694551.869923274731264, 7483076.470026861876249 ],...}
{ "type": "Feature", "properties": { "NOME": "local3", "REGIAO_ADM": "value3", "CODBAIRRO": "13"}, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 694555.509827277157456, 7483079.800010865554214 ], [ 694554.849827276892029, 7483077.34010686352849 ], [ 694551.869923274731264, 7483076.470026861876249 ],...}

JSON 看起来像:

[{ "cod": "13", "local": "local1", "nome": "value1" }, { "cod": "98", "local": "local2", "nome": "value2" }, { "cod": "97", "local": "local3", "nome": "value3" }]

有人知道我可能做错了什么,你能帮助我吗?

最佳答案

您可以获取数组并使用它来创建映射,以便您可以通过标识符(键)查找/字典值。您需要的数据结构是:

来自:

[{id:"A",property:"value1"},{id:"B",property:"value2"}, .... ]

致:

{A:{id:"A",property:"value1"},B:{id:"B",property:"value2"}, .... }

现在要查找对象 A 的属性,我们只需要访问该属性即可。

当前您的代码不保留键和值之间的关联。它获取属性值并创建一个数组,其中的属性值等于属性名称:

dataHash[item.cod] = item.cod;

如果 item.cod 等于“foo”,则 dataHash.foo ==“foo”。 dataHash[item.cod] 不嵌套属性:

var data = [{cod:1,nome:2,local:3},{cod:4,nome:5,local:6}]
        
        var dataHash = {};
        data.forEach(function(item) {
            if(item.cod) 
            dataHash[item.cod] = item.cod;
            if(item.nome) 
            dataHash[item.nome] = item.nome;
            if(item.local) 
            dataHash[item.local] = item.local;
        })
        
console.log(dataHash);

有很多方法可以实现你想要的,但是对于你的数据,当你创建字典时,代码可能看起来像这样(假设没有属性名称(不是值)以数字开头):

    var lookup = {};
    data.forEach(function(item) {
        if(item.id) {
          lookup[item.id] = {
            id: item.id,
            property1: item.property1,
            property2: item.property2,
            property3: item.property3
          }   
        }
      })

当然,如果您希望将所有属性都带入字典中,您可以使用:

    var lookup = {};
    data.forEach(function(item) {
        if(item.id) {
          lookup[item.id] = item
        }
      })

这假设您的数据中没有重复的条目

var data = [
 {id:"id1",property1:"text1",property2:"text2",property3:"text3"}, 
 {id:"id2",property1:"textA",property2:"textB",property3:"textC"}];
       
        var lookup = {};
        data.forEach(function(item) {
            if(item.id) {
              lookup[item.id] = {
                id: item.id,
                property1: item.property1,
                property2: item.property2,
                property3: item.property3
              }            
            }
        })
        
console.log(lookup)

现在您所要做的就是查找要加入到 geojson 中每个元素的值:

  geojson.features.forEach(function(item) {
            if(lookup([item.properties.id])) {
                item.properties.joined = lookup[item.properties.id]
            }
        })

由于 geojson 可能具有与传入数据同名的属性,因此我们可以将要加入的所有属性作为 join 的子属性放置。

对于您的数据,整个操作可能如下所示:

var geojson = {"type": "FeatureCollection",
"features": [
{ "type": "Feature", "properties": { "NOME": "local1", "REGIAO_ADM": "value1", "CODBAIRRO": "13"}},
{ "type": "Feature", "properties": { "NOME": "local2", "REGIAO_ADM": "value2", "CODBAIRRO": "13"}},
{ "type": "Feature", "properties": { "NOME": "local3", "REGIAO_ADM": "value3", "CODBAIRRO": "13"}}
  ]}
  
var data = [{ "cod": "13", "local": "local1", "nome": "value1" }, { "cod": "98", "local": "local2", "nome": "value2" }, { "cod": "97", "local": "local3", "nome": "value3" }]


var lookup = {};
data.forEach(function(item) {
  if(item.local) {
     lookup[item.local] = item;            
    }
})

geojson.features.forEach(function(d) {
  if (lookup[d.properties.NOME]) {
     d.properties.joined = lookup[d.properties.NOME];
  }
})

console.log(geojson);

该代码段假定 geojson 中的 local (在 json 中)和 NOME 是执行连接时使用的唯一值。

关于javascript - 传单中的 geojson 和 json 无法连接在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47510426/

相关文章:

c# - 为什么要在字典中使用不可变值?

c++ - 为什么 map 在 C++ 中不是多线程安全的?

ios - 快速调用中的额外参数

javascript - 删除指针事件 : none property . 不起作用

javascript - 嵌套的 {{#each}} 不工作

javascript - 在接口(interface) Typescript 中定义回调

javascript - Jquery:使用唯一键名称迭代嵌套 JSON

c# - 使用 POST 方法上传 JSON 对象时抛出 Bad Request Exception

javascript - 背景图像在 Ionic/Javascript/Angular 中不起作用

javascript - JavaScript中对象的多级嵌套