#javascript #json #bootstrap-modal
Вопрос:
Я пытаюсь открыть локальный файл json, просмотреть каждый объект в нем и импортировать всю информацию об объекте, «Страна» которого соответствует заранее определенному имени var.
Мой файл JSON (./olympics.json) выглядит примерно так:
{
"list": [
{
"Country": "United States",
"IOC": "USA",
"Summer_Gold": "1,070",
"Summer_Silver": 841,
"Summer_Bronze": 745,
"Summer_Total": "2,656",
"Winter_Gold": 105,
"Winter_Silver": 113,
"Winter_Bronze": 89,
"Winter_Total": 307,
"Total_Gold": "1,175",
"Total_Silver": 954,
"Total_Bronze": 834,
"Total_Total": "2,963"
},
...
]}
И то, что я пытался сделать, было:
$(".ModArea").click(function() {
var name = $(this).attr('title');
$("#country_name").html(name);
var json = require('./olympics.json');
var array = json.list;
for (var i = 0; i < array.length; i ) {
var check = array[i];
if (check["Country"] === name) {
var ioc = check["IOC"];
}
}
$("#IOC").html(ioc);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<img class="europe_img" src="https://mapswire.com/download/europe/europe-political-map-miller.jpg" usemap="#europe" alt="Europe">
<map name="europe">
<area class="ModArea" target="" alt="Iceland" title="Iceland" coords="138,388,35,540,232,748,549,585,516,374"
shape="poly" data-toggle="modal" data-target="#Modal">
<div class="modal fade" id="Modal" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle"
aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="country_name"></h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">amp;times;</span>
</button>
</div>
<div class="modal-body">
<p id="IOC">IOC: </p>
</div>
</div>
</div>
</div>
</map>
Часть о редактировании заголовка модала работает отлично, в то время как часть о МОК вообще не работает, может кто-нибудь помочь мне понять, почему?
Комментарии:
1. Что такое ключевое слово require ()? Вы используете RequireJS или что-то еще?
2. @n00b да, я использую RequireJS
Ответ №1:
Прежде всего, вы определяете переменную ioc внутри оператора if. Он не имеет никакого значения за пределами этого блока, и именно поэтому ваш код ведет себя так, как он есть.
Кроме того, я бы посоветовал вам использовать метод find() массива. Вы можете изменить свой код, чтобы он выглядел следующим образом:
$(".ModArea").click(function() {
var name = $(this).attr('title');
$("#country_name").html(name);
var json = require('./olympics.json');
$("#IOC").html(json.list.find(element => element.Country === name));
});
Он короче, использует более современный API и обладает лучшей производительностью благодаря оптимизации, которую предлагает функция find ().
Комментарии:
1. Я понимаю, как должен работать код, но когда я попытался его реализовать, тело все еще оставалось «IOC:».
2. Это может произойти только в том случае, если json.list.find(элемент => элемент. Страна === имя) не возвращает никаких элементов. Можете ли вы попытаться зарегистрировать возвращаемое значение этого кода для его двойной проверки?
3. использование F12 говорит мне, что проблема в том, что требование не определено, но я установил RequireJS через pip на своем конце, так как же я мог это решить?
4. Я не думаю, что вы можете установить зависимости js через pip. Вместо этого используйте <script src=» cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js » crossorigin=»анонимный» >></скрипт>
5. @NiceBooks, используя этот код, ошибка изменилась на «Имя модуля» olympics.json » еще не загружено для контекста: _. Use require ([])». поэтому я попытался реализовать решение, написанное здесь ( requirejs.org/docs/errors.html#notloaded ) с кодом от Грегорио, но у меня возникли некоторые проблемы с элементом.Часть страны, как она теперь говорит мне «ошибка сценария для ./olympics.json»