从JSON

时间:2018-01-04 11:41:28

标签: javascript json d3.js

我有一个像这样的json文件:

[
    {
        "countryName": "Austria",
        "countryID": "AT",
        "countryPopulation": 8451860,
        "regions":[
            {
                "regionName": "Burgenland (AT)",
                "regionID": "AT11",
                "regionPopulation": 286691 
            },
            {
                "regionName": "Niederösterreich",
                "regionID": "AT12",
                "regionPopulation": 1618592
            },
            {
                "regionName": "Wien",
                "regionID": "AT13",
                "regionPopulation": 1741246
            },
            {
                "regionName": "Kärnten",
                "regionID": "AT21",
                "regionPopulation": 555473 
            },
            {
                "regionName": "Steiermark",
                "regionID": "AT22",
                "regionPopulation": 1210971 
            },
            {
                "regionName": "Oberösterreich",
                "regionID": "AT31",
                "regionPopulation": 1418498 
            },
            {
                "regionName": "Salzburg",
                "regionID": "AT32",
                "regionPopulation": 531898 
            },
            {
                "regionName": "Tirol",
                "regionID": "AT33",
                "regionPopulation": 715888  
            },
            {
                "regionName": "Vorarlberg",
                "regionID": "AT34",
                "regionPopulation": 372603 
            }
        ]
    },
    {
        "countryName": "Belgium",
        "countryID": "BE",
        "countryPopulation": 11161642,
        "regions":[
            {
                "regionName": "Région de Bruxelles-Capitale",
                "regionID": "BE10",
                "regionPopulation": 1174624 
            },
            {
                "regionName": "Prov. Antwerpen",
                "regionID": "BE21",
                "regionPopulation": 1802309  
            },
            {
                "regionName": "Prov. Limburg (BE)",
                "regionID": "BE22",
                "regionPopulation": 855963 
            },
            {
                "regionName": "Prov. Oost-Vlaanderen",
                "regionID": "BE23",
                "regionPopulation": 1465150  
            },
            {
                "regionName": "Prov. Vlaams-Brabant",
                "regionID": "BE24",
                "regionPopulation": 1103737  
            },
            {
                "regionName": "Prov. West-Vlaanderen",
                "regionID": "BE25",
                "regionPopulation": 1177567 
            },
            {
                "regionName": "Prov. Brabant Wallon",
                "regionID": "BE31",
                "regionPopulation": 389479  
            },
            {
                "regionName": "Prov. Hainaut",
                "regionID": "BE32",
                "regionPopulation": 1332489 
            },
            {
                "regionName": "Prov. Liège",
                "regionID": "BE33",
                "regionPopulation": 1095977
            },
            {
                "regionName": "Prov. Luxembourg (BE)",
                "regionID": "BE34",
                "regionPopulation": 278278 
            },
            {
                "regionName": "Prov. Namur",
                "regionID": "BE35",
                "regionPopulation": 486069 
            }
        ]
    },
    {
        "countryName": "Bulgaria",
        "countryID": "BG",
        "countryPopulation": 7284552,
        "regions":[
            {
                "regionName": "Severozapaden",
                "regionID": "BG31",
                "regionPopulation": 823469 
            },
            {
                "regionName": "Severen tsentralen",
                "regionID": "BG32",
                "regionPopulation": 844511 
            },
            {
                "regionName": "Severoiztochen",
                "regionID": "BG33",
                "regionPopulation": 957460 
            },
            {
                "regionName": "Yugoiztochen",
                "regionID": "BG34",
                "regionPopulation": 1067981 
            },
            {
                "regionName": "Yugozapaden",
                "regionID": "BG41",
                "regionPopulation": 2128783 
            },
            {
                "regionName": "Yuzhen tsentralen",
                "regionID": "BG42",
                "regionPopulation": 1462348 
            }
        ]
    },
    ...

然后我有两个变量:csrs。在任何时候,只有其中一个与null不同。

cs包含用户选择的国家/地区,rs包含用户选择的区域。 如前所述,如果cs与null不同,则rs为空,反之亦然。 这是因为用户可以从地图中选择国家/地区或选择国家/地区。

我的目标是创建一个复选框(或类似的东西,我仍然要考虑它),它允许您选择超出当前区域(国家/地区),以及其他区域(国家/地区),以便您可以比较数据。 / p>

我想要的是:

  • if cs != null - >我想获得一个国家列表(Json文件中的所有国家/地区)

  • if rs != null - >我想获得rs所属国家的地区列表。

更好地了解对方: enter image description here

这是我试图做的。

// global variables
cs = null;  // if it is not null, the user has selected this country
csi = null; // country id
rs = null;  // if it is not null, the user has selected this region
rsi = null; // region id
currentCountries = null; // list of all countries
currentRegions = null; // list of regions in the selected country

/**
 * Function that creates line charts only when a country or a region is clicked.
 */
function createLineChart(antigenSelected, yearSelected, countrySelected, countrySelectedId, regionSelected, regionSelectedId) {
   defineLines(antigenSelected, yearSelected, countrySelected, countrySelectedId, regionSelected, regionSelectedId);
}

function defineLines(antigenSelected, yearSelected, countrySelected, countrySelectedId, regionSelected, regionSelectedId) {
   /**
    * To know if the user has clicked on the country or region, check that the selected region belongs to the selected country:
    *   - if it belongs to us -> the user has clicked on the selected region
    *   - if it does not belong to us -> the user has clicked on the selected country.
    * At any moment only one of the two possibilities is assigned (the other is null).
    */
   cs = null;  // if it is not null, the user has selected this country
   csi = null; // country id
   rs = null;  // if it is not null, the user has selected this region
   rsi = null; // region id

   // if the user has selected a region
   if(regionSelectedId != null && countrySelectedId == regionSelectedId.substring(0, 2)) {
      rs = regionSelected;
      rsi = regionSelectedId;
   }
   // if the user has selected a country
   else {
      cs = countrySelected;
      csi = countrySelectedId;
   }

   console.log("countrySelected: " + cs);
   console.log("regionSelected: " + rs);

   /**
    * Load json with countries and regions.
    */
   d3.json("../Project2/data/json/countriesAndRegions.json", function(error, countriesAndRegions) {
      if(error) {
         console.log("*** ERROR LOADING FILES: " + error + " ***");
         throw error;
      }

      countriesAndRegions.forEach(function(c) {
         allCountries.push(c.countryName);
         currentRegions = c.regions;
      });

      currentRegions.forEach(function(r) {
         //console.log(r.regionName);
      });

      console.log(allCountries);
      console.log(currentRegions);

      //var nested = d3.nest()
         // I have to nest data?
         //.object(currentRegions);

   });

}

显然这段代码不起作用。或者更确切地说,它适用于allCountries但不适用于currentRegions。 我怎么解决?我应该使用nest()方法吗?

我想要的是:

  • if cs != null - >得到所有国家
  • if rs != null - >获取rs地区所属国家/地区的所有地区。

非常感谢

为了简化,假设我有这个json文件。

var users = [
    {
        name: 'Corbin',
        age: 20,
        favoriteFoods: ['ice cream', 'pizza'],
        other: [
            {
                a: 12,
                b: "apple"
            }, 
            {
                a: 15,
                b: "pear"
            }
        ]
    },
    {
        name: 'John',
        age: 25,
        favoriteFoods: ['ice cream', 'skittle'],
        other: [
            {
                a: 0,
                b: "cinnamon"
            }, 
            {
                a: 854,
                b: "ginger"
            }, 
            {
                a: 24,
                b: "salt"
            }
        ]
    }
];

然后我有一个包含字符串ginger的变量。如何获取列表[cinnamon, ginger, salt]

如果我有一个包含字符串Corbin的变量,我该如何获取列表[Corbin, John]

3 个答案:

答案 0 :(得分:1)

例如,我有一个与json数组相同的json数组样本:

var users = [{name: 'Corbin', age: 20, favoriteFoods: ['ice cream', 'pizza']},
             {name: 'John', age: 25, favoriteFoods: ['ice cream', 'skittle']}];

我必须访问第二个用户的age属性,然后: users[1].age可以使用。

如果你必须访问第二个" favoriteFood"然后你应该使用第一个用户: users[0].favoriteFoods[2]

根据您的要求,我将发布另一个示例代码:

答案 1 :(得分:1)

好的,这个要求需要根据值获取 key ,并且我提出了一种使用递归调用的方法(虽然可能有更好的方法)。

步骤(简化):

  1. 循环播放数组。我们将数组元素称为row
  2. row
  3. 获取Object.keys(row)个密钥
  4. 遍历row
  5. 中的所有密钥
  6. 如果row[key]是对象,只需找到与传递的 value 匹配的相应键/值对(主要值 - cs或rs )并返回关联的key。 我已经使用了break个语句,最后根据关联的key使用了 array.map()
  7. 但如果row[key]数组,请使用递归调用并执行上述步骤。
  8. 希望这能解释代码。如果您有任何疑问,请告诉我。 :)

    
    
    var data = [
        {
            "countryName": "Austria",
            "countryID": "AT",
            "countryPopulation": 8451860,
            "regions":[
                {
                    "regionName": "Burgenland (AT)",
                    "regionID": "AT11",
                    "regionPopulation": 286691 
                },
                {
                    "regionName": "Niederösterreich",
                    "regionID": "AT12",
                    "regionPopulation": 1618592
                },
                {
                    "regionName": "Wien",
                    "regionID": "AT13",
                    "regionPopulation": 1741246
                },
                {
                    "regionName": "Kärnten",
                    "regionID": "AT21",
                    "regionPopulation": 555473 
                },
                {
                    "regionName": "Steiermark",
                    "regionID": "AT22",
                    "regionPopulation": 1210971 
                },
                {
                    "regionName": "Oberösterreich",
                    "regionID": "AT31",
                    "regionPopulation": 1418498 
                },
                {
                    "regionName": "Salzburg",
                    "regionID": "AT32",
                    "regionPopulation": 531898 
                },
                {
                    "regionName": "Tirol",
                    "regionID": "AT33",
                    "regionPopulation": 715888  
                },
                {
                    "regionName": "Vorarlberg",
                    "regionID": "AT34",
                    "regionPopulation": 372603 
                }
            ]
        },
        {
            "countryName": "Belgium",
            "countryID": "BE",
            "countryPopulation": 11161642,
            "regions":[
                {
                    "regionName": "Région de Bruxelles-Capitale",
                    "regionID": "BE10",
                    "regionPopulation": 1174624 
                },
                {
                    "regionName": "Prov. Antwerpen",
                    "regionID": "BE21",
                    "regionPopulation": 1802309  
                },
                {
                    "regionName": "Prov. Limburg (BE)",
                    "regionID": "BE22",
                    "regionPopulation": 855963 
                },
                {
                    "regionName": "Prov. Oost-Vlaanderen",
                    "regionID": "BE23",
                    "regionPopulation": 1465150  
                },
                {
                    "regionName": "Prov. Vlaams-Brabant",
                    "regionID": "BE24",
                    "regionPopulation": 1103737  
                },
                {
                    "regionName": "Prov. West-Vlaanderen",
                    "regionID": "BE25",
                    "regionPopulation": 1177567 
                },
                {
                    "regionName": "Prov. Brabant Wallon",
                    "regionID": "BE31",
                    "regionPopulation": 389479  
                },
                {
                    "regionName": "Prov. Hainaut",
                    "regionID": "BE32",
                    "regionPopulation": 1332489 
                },
                {
                    "regionName": "Prov. Liège",
                    "regionID": "BE33",
                    "regionPopulation": 1095977
                },
                {
                    "regionName": "Prov. Luxembourg (BE)",
                    "regionID": "BE34",
                    "regionPopulation": 278278 
                },
                {
                    "regionName": "Prov. Namur",
                    "regionID": "BE35",
                    "regionPopulation": 486069 
                }
            ]
        },
        {
            "countryName": "Bulgaria",
            "countryID": "BG",
            "countryPopulation": 7284552,
            "regions":[
                {
                    "regionName": "Severozapaden",
                    "regionID": "BG31",
                    "regionPopulation": 823469 
                },
                {
                    "regionName": "Severen tsentralen",
                    "regionID": "BG32",
                    "regionPopulation": 844511
                },
                {
                    "regionName": "Severoiztochen",
                    "regionID": "BG33",
                    "regionPopulation": 957460 
                },
                {
                    "regionName": "Yugoiztochen",
                    "regionID": "BG34",
                    "regionPopulation": 1067981 
                },
                {
                    "regionName": "Yugozapaden",
                    "regionID": "BG41",
                    "regionPopulation": 2128783 
                },
                {
                    "regionName": "Yuzhen tsentralen",
                    "regionID": "BG42",
                    "regionPopulation": 1462348 
                }
            ]
        }
    ];
    
    var cs = 'Belgium', rs = 'Yuzhen tsentralen';
    
    // cs is not null, get all countries but first find the key
    var mainKey = null;
    
    function getKey(array, value) {
      for(var i=0; i<array.length; i++) {
        var flag = false, row = array[i], keys = Object.keys(row);
        for(var j=0; j<keys.length; j++) {
          var key = keys[j];
          if(Array.isArray(row[key])) {
            getKey(row[key], value);
          } else if(row[key] === value) { 
            mainKey = key;
            flag = true;
            console.log(array.map(function(d) { return d[mainKey];}));
            break;
          }
        }
        if(flag) {
          break;
        }
      }  
    }
    
    if(cs != null) {
      getKey(data, cs);
    }
    if(rs != null) { 
      getKey(data, rs);
    }
    
    /********************
    This is what I thought earlier about the requirement, use it if you find it helpful
    *************/
    /*
    // with underscore.js
    var row = _.findWhere(data, {countryName: cs});
    if(row) { 
      console.log(row["regions"]);
      console.log(row["regions"].map(function(r) { return r["regionName"]; }));
    }
    
    // without underscore.js
    var index = null;
    for(var i=0; i<data.length; i++) { 
      if(data[i]['countryName'] === cs) {
         index = i;
         break;
      }
    }
    console.log(data[index]["regions"]);
    console.log(data[index]["regions"].map(function(r) { return r["regionName"]; }));
    */
    &#13;
    <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
    &#13;
    &#13;
    &#13;

答案 2 :(得分:0)

主要问题在于这段代码:

regionSelectedId != null && countrySelectedId == regionSelectedId.substring(0, 2)

由于countrySelectedIdnullregionSelectedId时始终为null,因此该表达式将始终返回false。您只需将其修改为有用的东西。