【问题标题】:Getting the values from a JSON从 JSON 中获取值
【发布时间】:2022-02-04 22:04:08
【问题描述】:

JSON 中的每个条目如下所示:

{
  "ALBA": [
    {
      "name": "ABRUD",
      "zip": "515100",
      "lat": "46.274675",
      "long": "23.065029"
    },
    {
      "name": "ABRUD-SAT",
      "zip": "515101",
      "lat": "46.283967",
      "long": "23.061093"
    },
}

第一个对象是县名,我还有很多,但我只是举个例子,嵌套对象是城市。我想要的是一种在 HTML 的选择标签中显示它们的方法,但我无法做到。

到目前为止,我有以下代码:

const getCities = () => {
    // Object.keys(regions).map(function(key, index) {
    //   console.log(regions[key]);
    // })
    for (const region in regions) {
      console.log(region); //this returns exactly what i want
    //cities.push(region)
    }
  }
  getCities();

在 html 中:

<div>
            <select name="city">
              <option value={cities}>{cities}</option>
            </select>
</div>

如何让这个选择标签准确地返回我的县,以及如何让另一个标签根据所选县向我显示城市名称?

编辑: 我设法做到了以下几点:

const getCities = () => {
    for (const region in regions) {
      cities.push(region);
    }
    return cities
  }
  getCities();


<div>
        <label htmlFor="city">County</label>
        <select name="city"
        onChange={(e) => setCity(e.target.value)}
        >
          {cities.map((city) => {
            return (
              <option value={city} key={city}>{city}</option>
            )
          })}
        </select>
      </div>

【问题讨论】:

  • 您的问题中没有JSON(仅在那一毫秒内,您将JSON.stringify() 的返回值传递给JSON.parse()getCities() 第一行的无操作中)跨度>
  • JSON.parse(JSON.stringify(regions)) 有什么意义,这会将region 转换为字符串 (JSON),然后立即再次解析。结果没有分配到任何地方,所以这条线根本没有意义,它只是在浪费 CPU 周期。
  • "console.log(region); //这完全返回了我想要的结果" - 为什么?那是一个区域 (ALBA) o.O 函数名为 getCities()&lt;select&gt; 的名称是 city...
  • 你说得对,我删除了第一行。
  • 区域变量是什么?整个代码会很有帮助。

标签: javascript html reactjs json


【解决方案1】:

尝试关注....

const countryCityMap = {
  "ALBA": [{
      "name": "ABRUD",
      "zip": "515100",
      "lat": "46.274675",
      "long": "23.065029"
    },
    {
      "name": "ABRUD-SAT",
      "zip": "515101",
      "lat": "46.283967",
      "long": "23.061093"
    }
  ]
}

function bindCountryCity(countryCityMap) {
  const countrySelector = document.querySelector('#countrySelector');

  const citySelector = document.querySelector('#citySelector');

  if (countrySelector) {
    clearOptions(countrySelector);
    addDefault(countrySelector);

    // Populate Countries
    Object.keys(countryCityMap).forEach(country => addOption(countrySelector, country, country));

    countrySelector.onchange = countrySelected
  }

  if (citySelector) {
    citySelector.onchange = function(selector) {
      console.log('[City Selection Changed]', selector.target.value);
    }
  }

  function addDefault(selector) {

    if (selector) {
      const defaultValue = selector.getAttribute('data-default-value') || 'select';
      const defaultText = selector.getAttribute('data-default-text') || 'select';
      addOption(selector, defaultText, defaultValue);
    }
  }


  function addOption(selector, optionText, optionValue) {
    if (selector) {
      selector.add(new Option(optionText, optionValue));
    }
  }


  function clearOptions(selector) {

    if (selector) {
      while (selector.options.length) {
        selector.remove(0);
      }
    }
  }

  function countrySelected(selectionChanged) {
    const selectedCountry = selectionChanged.target.value;
    console.log('[Country Selection Changed]', selectedCountry);

    clearOptions(citySelector);
    addDefault(citySelector);
    if (countryCityMap[selectedCountry]) {
      // populate corresponding cities
      countryCityMap[selectedCountry].map(cityEntry => getCityNames(cityEntry)).filter(x => (x || '').trim()).forEach(city => addOption(citySelector, city, city));
    }

    function getCityNames(cityEntry) {
      if (cityEntry && (cityEntry.name || '').trim()) {
        return (cityEntry.name || '').trim();
      }
    }
  }
}

bindCountryCity(countryCityMap);
<div>
  <select id="countrySelector" data-default-value="select_a_country" data-default-text="Select a country" style="margin: 10px; float: left">
    <option value="select_a_country">Select a country</option>
  </select>
</div>

<div>
  <select id="citySelector" data-default-value="select_a_city" data-default-text="Select a city" style="margin: 10px">
    <option value="select_a_city">Select a city</option>
  </select>
</div>

【讨论】:

  • 问题是关于使用 react 从嵌套数据结构中渲染元素。
  • @PeterSeliger,既然你提到了,我刚刚看到。此外,该 OP 已在稍后进行编辑以反映 react-ishness。
猜你喜欢
  • 2020-08-19
  • 2017-10-22
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多